自制電腦紅外遙控接收器_第1頁
自制電腦紅外遙控接收器_第2頁
自制電腦紅外遙控接收器_第3頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、自制電腦紅外遙控接收器(PC軟解碼)分類:嵌入式 智能家居 2009-10-14 09:52 4649人閱讀 評(píng)論(9)收藏 舉報(bào)網(wǎng)上有很多介紹紅外遙控接收器制作的文章,但其中大部分是用單片進(jìn)行紅外解 碼,然后再通過串口或USB把解碼后的按鍵信息傳入到 PC的。這樣的電路制 作起來,不僅造價(jià)相對(duì)偏高,而且需要對(duì)單片編程,這會(huì)令大部分軟件開發(fā)愛好 者望而卻步。最近看到一篇僅需要7個(gè)簡單元器件的紅外接收器,只需拿起烙鐵,不需硬件編 程就可以制作完成,原理圖如下:紅外按收頭1I50038X9針串口由原理圖我們可知,紅外接收頭把接收的紅外信號(hào)轉(zhuǎn)換為高低電平通過串口的DSR管腳傳入到PC,PC軟件通過對(duì)

2、DSR高低電平信號(hào)的時(shí)間曲線進(jìn)行分析, 從而獲得相對(duì)應(yīng)的按鍵信息。紅外遙控器一般采用脈寬調(diào)制的串行碼,經(jīng)38kHz的載頻把紅外信號(hào)發(fā)射出去。 其編碼信息一般由三部分組成:引導(dǎo)碼、地址碼和數(shù)據(jù)碼。一般信號(hào)長度大約 100ms左右,持續(xù)按鍵則重復(fù)發(fā)送(中間會(huì)有 10ms以上的間歇)。 常態(tài)下,紅外接收頭的輸出(OUT)都是高電平,引導(dǎo)碼信號(hào)首先會(huì)令紅外接收頭 輸出一個(gè)大約10ms左右的低電平(不同遙控器有不同的時(shí)延),這可令接收設(shè) 備從容判定信號(hào)的到來,而后面的地址碼和數(shù)據(jù)碼其電平高低變化就相對(duì)較快 了,大概在幾十或幾百個(gè)微秒之間。PC紅外遙控軟件一般選用 Girder,在使用之前需要安裝“ SF

3、H-56 plugin for Girder ”這個(gè)插件(文件名"igor SFH-56P lug.dll"),否則不能正常處理我們 這種電路的紅外接收器信號(hào)??杀氖俏抑两駴]找到這個(gè)插件,網(wǎng)上提供的很多 鏈接都是壞的。即使找到了這個(gè)插件,要想在我們自己編寫的程序中使用也是困難的,因?yàn)镚irder并沒有為我們開發(fā)者提供API接口。既然Girder能用軟件實(shí)現(xiàn)紅外解碼,我們?yōu)槭裁床荒苣兀糠彩露家_動(dòng)大腦, 積極行動(dòng)才對(duì),下面就是我自己焊接的一個(gè)紅外接收器(元器件是在中發(fā)買的,一共不到10元錢,還富裕好多電阻、電容?。?圖下方的紅外遙控器的接收器是基于 USB的,僅支持Vist

4、a以上版本,并且 不支持個(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、由于紅外遙控信號(hào)是脈寬調(diào)制的串行碼,所以我們需要采集信號(hào)的寬度,顯然采用一般的時(shí)鐘函數(shù)來獲取時(shí)間間隔是不可行的,因?yàn)榫忍停晕覀冃栌貌捎枚嗝襟w時(shí)鐘和高精度計(jì)時(shí)的 API函數(shù)。3、 一般我們按鍵持續(xù)時(shí)間為幾秒鐘,并且由于按鍵發(fā)出前有一個(gè)10ms左右的

5、 引導(dǎo)信號(hào),所以我們的程序很容易判斷出信號(hào)起始點(diǎn), 這樣我們一次僅需要接收 一定量的原始數(shù)據(jù)就可以完成初步信號(hào)米集工作。4、對(duì)于我們的紅外接收程序來說并不需要實(shí)際解碼出紅外信號(hào)到底包含了那些 具體的信息,只要其能夠區(qū)分出紅外遙控上的各個(gè)按鍵就行。5、由于紅接收器是通過串口 RTS管腳供電,且通過DSR傳遞紅外信號(hào)的,所以我們的程序即使不接收數(shù)據(jù),也要打開串口,不過僅需要處理RTS和DSR管腳的信號(hào)即可。好了,動(dòng)手去做,下面是用VC實(shí)現(xiàn)的一個(gè)DLL,其功能就是接收并記錄紅外信 號(hào)的持續(xù)時(shí)間。核心代碼如下:DWORD WINAPI ThreadProc(LPVOID pParam)LARGE_IN

6、TEGER litmp;LONGLONG QPart1,QPart2;double dfFreq;int iTime=0; / 微秒/獲得計(jì)數(shù)器的時(shí)鐘頻率QueryPerforma nceFreque ncy(&litmp);dfFreq = (double)1000000.0/litmp.QuadPart;DWORD ModemState,oldModemState=MS_DSR_ON;EV_BREAK or EV_CTS or EV_DSR or EV_ERR or EV_RING orEV_RLSD or EV_RXCHAR or EV_RXFLAG or EV_TXEMPTYS

7、etCommMask(HSC_COM_Ha ndle,EV_DSR);/DWORD EvtMask,dwError;/COMSTAT cs;while(HSC_Thread_Ru nFlag)/等待DSR信號(hào)發(fā)生變化/WaitCommEve nt(HSC_COM_Ha ndle,&EvtMask,&HSC_Ovread);ClearCommError(HSC_COM_Ha ndle,&dwError,&cs);/獲得DSR的狀態(tài)GetCommModemStatus(HSC_COM_Ha ndle,&M odemState);ModemState = (M

8、odemState & MS_DSR_ON); if(ModemState = oldModemState)continue;oldModemState=ModemState;/清計(jì)數(shù)In terlockedExcha nge(&HSC_NUM,0);/開始接收數(shù)據(jù)if(HSC_State = 0 && ModemState = 0)QueryPerforma nceCo un ter(&litmp);QPart1 = litmp.QuadPart;HSC_State=1;/復(fù)位計(jì)數(shù)In terlockedExcha nge( &HSC_NUM,

9、0);In terlockedExcha nge( &HSCn dex,0);/開啟定時(shí)器HSC_TimerlD =timeSetEve nt(10,HSC_Accuracy,MMTimer,NULL,TIME_PERIODIC);con ti nue;/接收數(shù)據(jù)狀態(tài)if(HSC_State = 1)QueryPerforma nceCo un ter(&litmp);QPart2 = litmp.QuadPart;/-if(ModemState = 0)iTime = (in t)(QPart2-QPart1)*dfFreq);elseiTime = (in t)(QPart

10、1-QPart2)*dfFreq);if(HSC_l ndex < HSC_BufferSize)*(HSC_Buffer+HSC_l ndex) = iTime;In terlockedl ncreme nt(&HSC _ln dex);/-QPart1=QPart2;return STILL_ACTIVE;不過它會(huì)讓CPU使用時(shí)如果采用 WaitCommEvent函數(shù),你會(huì)發(fā)現(xiàn)CPU使用時(shí)間會(huì)很低,接收程序無法正常退出,所以只好注釋掉該函數(shù)了,此時(shí)你會(huì)發(fā)現(xiàn) 間會(huì)很高。原始數(shù)據(jù)一旦采集完畢,剩下的就由C#程序大顯身手吧。C#中DLL的接口函數(shù)如下:const string Dl

11、lPath = "YFHSCollect.dll"Dlllmport(DIIPath)public static extern Int32 HSCStart(Int32 COM, Int32 delay, Int32 BufferSize);Dlllmport(DllPath)public static extern In t32 HSCE nd();Dlllmport(DIIPath)public static extern Int32 HSCData(int intData);我封裝了一個(gè)類,一旦有按鍵信息,就會(huì)觸發(fā)一個(gè) Click事件。此外程序還具備 自學(xué)習(xí)功能,并且

12、可以把學(xué)習(xí)后的結(jié)果序列化到一個(gè) XML文件中去,這樣下次 再按鍵就可以識(shí)別出鍵名了。主程序中測試代碼如下:public partial class frmMa in : FormYFHWCollect hw =n ull;in t hwData = null;public frmMai n()In itializeComp onen t();hw = new YFHWCollect(this, 1);hw.Click += new YFHWCollect.HWEve ntHa ndler(hw_Click);void hw_Click(object sen der, HWEve ntArgs

13、e)stri ng strI nfo =""for (i nt j = 0; j < e.lstDatai.Le ngth; j+)strI nfo += e.lstDataij.ToStri ng() + ""strI nfo += "/r/n"txtI nfo.Text = strI nfo;IblKeyName.Text = e.KeyName+ " (" + (e.I nterval /10).ToStri ng() "ms)"hwData = e.Data;picBar.Refr

14、esh();private void btnCommand_Click(object sender, EventArgs e)if (bt nComma nd.Text =" 開始")bt nComma nd.Text ="停止"hw.Start();elsebt nComma nd.Text =" 開始"hw.E nd();private void btnStudy_Click(object sender, EventArgs e)hw.Study(txtKeyName.Text);private void picBar_Pa in

15、 t(object sen der, Pai ntEve ntArgs e)int width = picBar.Width, height = picBar.Height;/ 2, width, height / 2);if (hwData != n ull)float Len=0;foreach(i nt l in hwData)Len+=l;float dx = width / Len, DX=0;Pen p = new Pen(Color.Green);float Y=0, 丫仁 height/4,Y2=(float)(height*3.0/4.0);float X=0;for(int

16、 i=0;i<hwData.Length;i+)Y = (i % 2)=0 ? Y2:Y1);DX = hwDatai * dx;+ DX, Y);X += DX;測試程序運(yùn)行結(jié)果如下:工 益 ET 262T 濫25272T歴紅外承控儔號(hào)叢杖測試l ro.fSc4 3 4 4 4 4 4 4-444 s 4 4 4 4 4 4-4-44 444 4 4 444暫 £ 二!<口 ? s 8243 44 44 44 44 44 4(上面顯示的數(shù)據(jù)為高電平和低電平的持續(xù)時(shí)間(低高低高),單位為 1/10毫秒)注意事項(xiàng):1、紅外遙控器按鍵偶數(shù)次和奇數(shù)次的編碼是不同的,程序需要學(xué)習(xí)兩次,才能 正常識(shí)別按鍵信息。2、 普通的USB轉(zhuǎn)串口由于僅連接了 2、3、5管腳,所以不能正常使用,對(duì)比 較好的USB轉(zhuǎn)串口(比如Moxa的三百多一根),雖然所有的管腳都引出了, 但是由于是通過USB轉(zhuǎn)換的,所以響應(yīng)時(shí)間很是問題,我就因?yàn)檫@個(gè)差一點(diǎn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論