遙控接收器制作過程_第1頁
遙控接收器制作過程_第2頁
遙控接收器制作過程_第3頁
遙控接收器制作過程_第4頁
遙控接收器制作過程_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、自制電腦紅外遙控接收器(PC軟解碼)網(wǎng)上有很多介紹紅外遙控接收器制作的文章,但其中大部分是用單片進(jìn)行紅外解碼,然后再通過串口或USB把解碼后的按鍵信息傳入到PC的。這樣的電路制作起來,不僅造價(jià)相對偏高,而且需要對單片編程,這會(huì)令大部分軟件開發(fā)愛好者望而卻步。最近看到一篇僅需要7個(gè)簡單元器件的紅外接收器,只需拿起烙鐵,不需硬件編程就可以制作完成,原理圖如下:由原理圖我們可知,紅外接收頭把接收的紅外信號(hào)轉(zhuǎn)換為高低電平通過串口的DSR管腳傳入到PC,PC軟件通過對DSR高低電平信號(hào)的時(shí)間曲線進(jìn)行分析,從而獲得相對應(yīng)的按鍵信息。紅外遙控器一般采用脈寬調(diào)制的串行碼,經(jīng)38kHz的載頻把紅外信號(hào)發(fā)射出去。

2、其編碼信息一般由三部分組成:引導(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ù)碼其電平高低變化就相對較快了,大概在幾十或幾百個(gè)微秒之間。PC紅外遙控軟件一般選用Girder,在使用之前需要安裝“SFH-56 plugin for Girder”這個(gè)插件(文件名igor SFH-56P lug.dll),否則不能正常處理我們這種電路的紅外接收器信號(hào)??杀?/p>

3、是我至今沒找到這個(gè)插件,網(wǎng)上提供的很多鏈接都是壞的。即使找到了這個(gè)插件,要想在我們自己編寫的程序中使用也是困難的,因?yàn)镚irder并沒有為我們開發(fā)者提供API接口。既然Girder能用軟件實(shí)現(xiàn)紅外解碼,我們?yōu)槭裁床荒苣兀糠彩露家_動(dòng)大腦,積極行動(dòng)才對,下面就是我自己焊接的一個(gè)紅外接收器(元器件是在中發(fā)買的,一共不到10元錢,還富裕好多電阻、電容?。▓D下方的紅外遙控器的接收器是基于USB的,僅支持Vista以上版本,并且不支持個(gè)人開發(fā),不過今天它終于發(fā)揮了它應(yīng)有的作用。當(dāng)然用電視或VCD遙控器也是可以的)硬件有了,但程序該從何編起呢?1、由于接收到的紅外信號(hào)在微秒級(jí)別中變化,對系統(tǒng)實(shí)時(shí)性要求較

4、高,所以具備垃圾回收功能,實(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)榫忍?,所以我們需用采用多媒體時(shí)鐘和高精度計(jì)時(shí)的API函數(shù)。3、一般我們按鍵持續(xù)時(shí)間為幾秒鐘,并且由于按鍵發(fā)出前有一個(gè)10ms左右的引導(dǎo)信號(hào),所以我們的程序很容易判斷出信號(hào)起始點(diǎn),這樣我們一次僅需要接收一定量的原始數(shù)據(jù)就可以完成初步信號(hào)采集工作。4、對于我們的紅外接收程序來說并不需要實(shí)際解碼出紅外信號(hào)到底包含了那些具體的信息,只要其能夠區(qū)

5、分出紅外遙控上的各個(gè)按鍵就行。5、由于紅接收器是通過串口RTS管腳供電,且通過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;/微秒/獲得計(jì)數(shù)器的時(shí)鐘頻率QueryPerformanceFrequency(&litmp);dfFreq=(

6、double)1000000.0/litmp.QuadPart;DWORDModemState,oldModemState=MS_DSR_ON;/EV_BREAKorEV_CTSorEV_DSRorEV_ERRorEV_RINGorEV_RLSDorEV_RXCHARorEV_RXFLAGorEV_TXEMPTY/SetCommMask(HSC_COM_Handle,EV_DSR);/DWORDEvtMask,dwError;/COMSTATcs;while(HSC_Thread_RunFlag)/等待DSR信號(hào)發(fā)生變化/WaitCommEvent(HSC_COM_Handle,&EvtMas

7、k,&HSC_Ovread);/ClearCommError(HSC_COM_Handle,&dwError,&cs);/獲得DSR的狀態(tài)GetCommModemStatus(HSC_COM_Handle,&ModemState);ModemState=(ModemState&MS_DSR_ON);if(ModemState=oldModemState)continue;oldModemState=ModemState;/清計(jì)數(shù)InterlockedExchange(&HSC_NUM,0);/開始接收數(shù)據(jù)if(HSC_State=0&ModemState=0)QueryPerformanceC

8、ounter(&litmp);QPart1=litmp.QuadPart;HSC_State=1;/復(fù)位計(jì)數(shù)InterlockedExchange(&HSC_NUM,0);InterlockedExchange(&HSC_Index,0);/開啟定時(shí)器HSC_TimerID=timeSetEvent(10,HSC_Accuracy,MMTimer,NULL,TIME_PERIODIC);continue;/接收數(shù)據(jù)狀態(tài)if(HSC_State=1)QueryPerformanceCounter(&litmp);QPart2=litmp.QuadPart;/-if(ModemState=0)iT

9、ime=(int)(QPart2-QPart1)*dfFreq);elseiTime=(int)(QPart1-QPart2)*dfFreq);if(HSC_IndexHSC_BufferSize)*(HSC_Buffer+HSC_Index)=iTime;InterlockedIncrement(&HSC_Index);/-QPart1=QPart2;returnSTILL_ACTIVE;如果采用WaitCommEvent函數(shù),你會(huì)發(fā)現(xiàn)CPU使用時(shí)間會(huì)很低,不過它會(huì)讓接收程序無法正常退出,所以只好注釋掉該函數(shù)了,此時(shí)你會(huì)發(fā)現(xiàn)CPU使用時(shí)間會(huì)很高。原始數(shù)據(jù)一旦采集完畢,剩下的就由C#程序大顯身

10、手吧。C#中DLL的接口函數(shù)如下: const string DllPath = YFHSCollect.dll; DllImport(DllPath) public static extern Int32 HSCStart(Int32 COM, Int32 delay, Int32 BufferSize); DllImport(DllPath) public static extern Int32 HSCEnd(); DllImport(DllPath) public static extern Int32 HSCData(int intData);我封裝了一個(gè)類,一旦有按鍵信息,就會(huì)觸發(fā)一

11、個(gè)Click事件。此外程序還具備自學(xué)習(xí)功能,并且可以把學(xué)習(xí)后的結(jié)果序列化到一個(gè)XML文件中去,這樣下次再按鍵就可以識(shí)別出鍵名了。主程序中測試代碼如下:publicpartialclassfrmMain:FormYFHWCollecthw=null;inthwData=null;publicfrmMain()InitializeComponent();hw=newYFHWCollect(this,1);hw.Click+=newYFHWCollect.HWEventHandler(hw_Click);voidhw_Click(objectsender,HWEventArgse)stringstr

12、Info=;for(inti=0;ie.lstData.Count;i+)for(intj=0;je.lstDatai.Length;j+)strInfo+=e.lstDataij.ToString()+;strInfo+=rn;txtInfo.Text=strInfo;lblKeyName.Text=e.KeyName+(+(e.Interval/10).ToString()+ms);hwData=e.Data;picBar.Refresh();privatevoidbtnCommand_Click(objectsender,EventArgse)if(btnCommand.Text=開始)

13、btnCommand.Text=停止;hw.Start();elsebtnCommand.Text=開始;hw.End();privatevoidbtnStudy_Click(objectsender,EventArgse)hw.Study(txtKeyName.Text);privatevoidpicBar_Paint(objectsender,PaintEventArgse)intwidth=picBar.Width,height=picBar.Height;e.Graphics.DrawLine(newPen(Color.Gray),0,height/2,width,height/2);

14、if(hwData!=null)floatLen=0;foreach(intlinhwData)Len+=l;floatdx=width/Len,DX=0;Penp=newPen(Color.Green);floatY=0,Y1=height/4,Y2=(float)(height*3.0/4.0);floatX=0;for(inti=0;ihwData.Length;i+)Y=(i%2)=0?Y2:Y1);DX=hwDatai*dx;e.Graphics.DrawLine(p,X,Y,X+DX,Y);X+=DX;e.Graphics.DrawLine(p,X,Y1,X,Y2);測試程序運(yùn)行結(jié)果如下:(上面顯示的數(shù)據(jù)為高電平和低電平的持續(xù)時(shí)間(低高低高),單位為1/10毫秒)注意事項(xiàng):1、紅外遙控器按鍵偶數(shù)次和奇數(shù)次的編碼是不同的,程序需要學(xué)習(xí)兩次,才能正常識(shí)別按鍵信息。2、普通的USB轉(zhuǎn)串口由于僅連接了2、3、5管腳,所以不能正常使用,對比較好的US

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論