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