基于MSP430、STM32的2.4G無線游戲遙控器實(shí)現(xiàn)
歷時(shí)7天,跨度兩個(gè)多星期,才將微型四軸的遙控器調(diào)試好,中間除了備考兩科考試,其余時(shí)間全在宿舍蹭網(wǎng)消磨青春,不得不說狀態(tài)不好,實(shí)際上內(nèi)心也極度的空虛。
之前將微型四軸的機(jī)體做好,迫不及待的進(jìn)行了一下測(cè)試,天真的以為,飛機(jī)不用遙控器也可以,實(shí)際上我設(shè)想的是直接用手頭的開發(fā)板對(duì)其進(jìn)行簡單的增減速,為此我還特意為它寫了一個(gè)觸摸控制界面,只有三個(gè)觸控點(diǎn),一個(gè)加速,一個(gè)減速,一個(gè)停止,非常無聊。
后來發(fā)現(xiàn),沒有一個(gè)遙控器真的非常不方便,周六便去二手市場(chǎng)僅用5元便淘得一飛機(jī)遙控器,里面電池都還沒用完,質(zhì)量算上乘。這遙控器是紅外遙控的,用手機(jī)看了下紅外管,能夠正常發(fā)光實(shí)際上,我當(dāng)然最希望直接對(duì)現(xiàn)有電路進(jìn)行一下線路修改就實(shí)現(xiàn)最方便了,事情往往沒有那么順利。
仔細(xì)端詳了這塊板子,一大堆的元件,右上角唯一的一塊芯片卻也被磨去型號(hào),對(duì)于我這種電路經(jīng)驗(yàn)較少的青年自然無從下手,遂決定重新開發(fā)一塊。但是為了能夠跟原先機(jī)殼匹配,電路的摸樣和尺寸,完全根據(jù)原板用尺子測(cè)量而規(guī)劃。
遙控器板子采用低功耗MSP430G2553主控,NRF24L01發(fā)射遙控信號(hào)。對(duì)于操縱桿,說白了就是一個(gè)雙方向和一個(gè)四方向的電位器,通過430內(nèi)部AD采樣便可得到操縱命令,電路十分簡潔。實(shí)際上,遙控器的程序也相當(dāng)?shù)暮唵?,就我目前需要?shí)現(xiàn)的功能來看。只需要根據(jù)AD門限值判斷出上下左右的方向,然后直接發(fā)送給接收機(jī)即可。電源穩(wěn)壓用ASM1117-3.3V實(shí)測(cè)它的壓降有1V,所以至也得4.3V供電,事實(shí)上買回來這破東西的時(shí)候里面就殘存有6節(jié)干電池,測(cè)了一下電壓還有6V,足夠我調(diào)試揮霍。實(shí)現(xiàn)代碼如下:
在遙控板子左上角的排針是我預(yù)留的程序調(diào)試和燒寫端口,同樣的為了方便,我并不需要再做下載器了,直接采用TI推出的大學(xué)計(jì)劃的LaunchPad可以完美的實(shí)現(xiàn)程序調(diào)試和燒寫,這塊LaunchPad最值錢的地方就在于它的仿真器,官方才賣8美元,而一個(gè)430仿真器市面價(jià)格是200,上學(xué)期學(xué)校給了一塊比賽用,電子工程師之家網(wǎng)站又送了我一塊,那塊G2553就是我從上面摳下來的。
當(dāng)然,最為重點(diǎn)的地方便在于接收端了,怎么實(shí)現(xiàn)接收到的數(shù)據(jù)能夠操控電腦游戲?這點(diǎn)由于之前我做了有線重力感應(yīng)的游戲遙控器,我試圖仍然采用此方法,就是通過STM32把命令接收下來,然后通過串口傳到我的VC上位機(jī),用上位機(jī)的程序?qū)崿F(xiàn)鍵盤敲擊的命令。
VC上位機(jī)上,我同樣用的是keybd_event事件來實(shí)現(xiàn)按鍵的按下和彈起。
那天晚上我測(cè)試了電腦上的所有程序窗口以及幾個(gè)小游戲,發(fā)現(xiàn)都沒有問題,可以實(shí)現(xiàn)操控,第二天我想正式在極品飛車上測(cè)試的時(shí)候,終于暴露除了問題,根本沒有效果!是的,VC的這段代碼在游戲里面無法實(shí)現(xiàn)操控,為什么其它的程序可以,而就是這大型的游戲不行,后來百度查了一下,終于看出點(diǎn)端倪,好像是說這種游戲的操作用的那種操控方式是直接讀取電腦鍵盤的那個(gè)端口來接收命令的,我用VC寫的那段代碼實(shí)際上只是模擬出了系統(tǒng)按鍵而已。網(wǎng)上也沒有給出解決方法,后來我問了下一個(gè)以前通過影子系統(tǒng)認(rèn)識(shí)的一位程序開發(fā)工程師,他告訴我用Winio來向鍵盤端口寫入命令達(dá)到驅(qū)動(dòng)級(jí)的命令試試。
后來發(fā)現(xiàn),效果是一樣的,并且由于我對(duì)VC++編程經(jīng)驗(yàn)不豐富,直接操作了端口導(dǎo)致給電腦帶來了不好的后果,導(dǎo)致了我筆記本的鍵盤按鍵出現(xiàn)了紊亂,當(dāng)然對(duì)于我的電腦這一切都不是問題,由于Powershadow的保護(hù),很多問題重啟之后便得到了解決。
我不相信用VC不可以實(shí)現(xiàn),但是這已經(jīng)涉及到計(jì)算機(jī)的端口這些跟底層相關(guān)的東西,專研下去對(duì)我來講太困難,畢竟缺少專業(yè)的知識(shí)和經(jīng)驗(yàn)。經(jīng)過考慮我終于還是決定采用比較簡單的方案,直接通過單片機(jī)模擬出鍵盤的PS/2協(xié)議,讓電腦就認(rèn)為它是一個(gè)鍵盤,這樣子,所有的操作對(duì)于電腦的任何程序必定都是有效的。PS/2的協(xié)議相對(duì)來講,也是比較簡單,跟串口有點(diǎn)類似,一個(gè)時(shí)鐘脈沖發(fā)送一位數(shù)據(jù),只要知道鍵盤的編碼,給電腦發(fā)過去就OK了。
對(duì)于該時(shí)序的實(shí)現(xiàn)代碼如下
而鍵盤的掃描碼可以查表獲得,分為通碼和斷碼,對(duì)于鍵盤來講,按鍵按下的時(shí)候就是向電腦發(fā)送了通碼,釋放的時(shí)候,就是給電腦發(fā)送了斷碼,這個(gè)我用示波器也看過鍵盤的波形,為此發(fā)波學(xué)弟還特意給我抱來一臺(tái)數(shù)字示波器,真心非常的感謝。
鍵盤的協(xié)議有些比較有趣的地方,比如,你先按下‘上’不放,然后按下‘左’,那么就只有‘左’是有效的了,并且此時(shí)你放開‘左’,‘上’雖然依舊按下,但是它已經(jīng)無效了。那為什么在游戲里面我可以同時(shí)按下上和右,并且它們都是有效的呢,因?yàn)橛螒蚶锩嬷灰盏桨存I的通碼之后沒有收到到按鍵的斷碼,那么它都是在執(zhí)行命令的。而這段協(xié)議可以通過以下代碼實(shí)現(xiàn)。
整個(gè)接收電路我直接用開發(fā)板兼萬用板搭了個(gè)簡單的3.3V轉(zhuǎn)5V電路實(shí)現(xiàn),顯得有些凌亂,但不缺美麗。為了能夠在我I5處理器的acer上實(shí)現(xiàn)當(dāng)然還得PS/2轉(zhuǎn)USB接口
最后,進(jìn)行《極品飛車》實(shí)戰(zhàn)測(cè)試
實(shí)際上,我很少玩游戲,但是也略懂,在《極品飛車》里除了控制方向鍵之外,還有按ALT鍵液氮加速的,當(dāng)然我也考慮到了這點(diǎn),事實(shí)上,我在遙控器的板子上預(yù)留了兩個(gè)按鍵專用的端口,可以實(shí)現(xiàn)。