<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > EDA/PCB > 設(shè)計應(yīng)用 > 低成本人機(jī)交互設(shè)計:基于FPGA的體感游戲

          低成本人機(jī)交互設(shè)計:基于FPGA的體感游戲

          作者: 時間:2016-10-29 來源:網(wǎng)絡(luò) 收藏

          體感游戲是視覺與本體感覺和動作控制的集合,伴隨著虛擬現(xiàn)實技術(shù)的迅猛發(fā)展,正逐步走入市場。為了達(dá)到視覺、運動相結(jié)合的目的,采用加速度傳感器與VGA顯示器相結(jié)合的方法,通過戴有速度手套的手的運動來完成對游戲界面中的滑塊控制,接住隨機(jī)下落的方塊而獲得分?jǐn)?shù)。最后進(jìn)行了板級測試,實現(xiàn)了開機(jī)界面、模式切換、難度調(diào)節(jié)、計分、游戲暫停與重新開始等功能。通過驗證,游戲獲得了較好的互動性、參與感與沉浸感。

          本文引用地址:http://www.ex-cimer.com/article/201610/308394.htm

          計算機(jī)游戲領(lǐng)域已經(jīng)到了一個同質(zhì)化相當(dāng)嚴(yán)重的時代。機(jī)械性的重復(fù)相同的動作致使玩家的興趣越來越低。而現(xiàn)在游戲產(chǎn)業(yè)迎來了一個轉(zhuǎn)折點,開始向交互性、置入感等方向發(fā)展。而良好的沉浸感要求游戲必須在互動性上有創(chuàng)新。過去,游戲大部分是通過鍵盤與鼠標(biāo)來完成控制的,但隨著傳感器技術(shù)、微機(jī)視覺的進(jìn)步,使得利用自己的行動來對機(jī)器發(fā)出指令的愿望得以實現(xiàn)。這種人機(jī)互動模式以更為自然性、直觀性的運動、語音等摸式代替電腦的鍵盤和鼠標(biāo)等外設(shè)。

          現(xiàn)在已經(jīng)有了很多創(chuàng)新成果,如三維攝像機(jī)、傳感器球拍、數(shù)據(jù)手套等。一些公司也推出了各種平臺,如日本任天堂公司的Wii、微軟的Kinect、華碩的Xtion等。這些設(shè)備一般較為昂貴,本文設(shè)計目的是低成本來完成人機(jī)交互,利用FPGA作為主控制器,借助現(xiàn)代家庭較為普及的電腦的顯示器,實現(xiàn)體感游戲的設(shè)計,提高游戲的沉浸感與趣味性,同時保持了對于鍵盤操作的兼容性。

          1 系統(tǒng)設(shè)計方案

          該系統(tǒng)主要由兩個部分組成,分別是數(shù)據(jù)采集單元、顯示控制單元。數(shù)據(jù)采集單元主要實現(xiàn)對運動控制信息的采集、數(shù)據(jù)的修正與處理、上傳到顯示控制單元等功能。顯示控制單元主要實現(xiàn)游戲的開始、難度設(shè)定、模式切換、顯示等功能。整體框圖如圖1所示。

          圖1 系統(tǒng)整體框圖

          1.1 數(shù)據(jù)采集單元

          數(shù)據(jù)采集單元主要包括從控制器、加速度傳感器、LED顯示、按鍵、串口四個硬件部分。各部分的選擇和功能如下:

          從控制器選用STC89C51單片機(jī),此系列單片機(jī)是宏晶科技推出的新一代超強(qiáng)抗干擾、低功耗、高性價比的單片機(jī),指令代碼完全兼容傳統(tǒng)8051單片機(jī),并且有LQFP封裝,使得速度手套可以做到小型化。

          加速度傳感器選用的是ADXL345。它是一款完整的3 軸加速度測量系統(tǒng)。既能測量運動或沖擊導(dǎo)致的動態(tài)加速度,也能測量靜止加速度,例如重力加速度,使得器件可作為傾斜傳感器使用。本設(shè)計中利用了其測靜止加速度的功能,得到傾斜角度,從而產(chǎn)生控制指令。

          采集單元中用了兩個LED燈,用于顯示當(dāng)前速度手套的輸出狀態(tài):當(dāng)左側(cè)燈亮說明發(fā)出的控制信號為向左運動。兩個按鍵輸入用于游戲的控制信號暫停和分?jǐn)?shù)清零的信號的產(chǎn)生。

          采集單元利用串口將控制信號上傳到顯示控制單元。RS232是由電子工業(yè)協(xié)會(Electronic Industries Association,EIA)所制定的異步傳輸標(biāo)準(zhǔn)接口。在低通信速率下,直接連接的最大物理距離為15 m,可以使得人能遠(yuǎn)離屏幕來操作游戲,防止眼睛疲勞。后期會考慮采用315模塊來實現(xiàn)無線的操作。

          1.2 顯示控制單元

          此單元是整個系統(tǒng)的核心,完成了游戲的大部分功能設(shè)計,主要包括主控制器、VGA接口、PS/2接口、獨立按鍵、數(shù)碼管、串口等硬件部分。

          主控制器采用Altera于2004年推出的CycloneⅡ的FPGA,型號為EPC2C8208。其功耗較低,核電壓只有1.2 V,片上RAM 有162 Kb,可以用于配置為RAM,ROM,F(xiàn)IFO等,時鐘利用50 MHz的有源晶體產(chǎn)生??偪刂茊卧?fù)責(zé)接收數(shù)據(jù)采集單元的信號、兩種游戲模式的切換和控制指令的產(chǎn)生、VGA顯示控制、游戲初始化界面存儲等。

          2 系統(tǒng)軟件實現(xiàn)

          游戲主要實現(xiàn)的功能有:歡迎界面與游戲界面的切換以及VGA顯示;速度手套模式與鍵盤模式的切換;計分系統(tǒng),包含分?jǐn)?shù)的顯示、清零等;游戲的難度等級設(shè)置、游戲的開始界面設(shè)計、暫停、結(jié)束、重新開始等功能。軟件設(shè)計包括單片機(jī)、FPGA的程序設(shè)計以及兩者通信指令編碼準(zhǔn)則設(shè)定三個方面。

          2.1 單片機(jī)程序設(shè)計

          單片機(jī)部分主要功能為通過采集加速度傳感器和按鍵的信號,根據(jù)兩個單元間的編碼準(zhǔn)則產(chǎn)生相應(yīng)的控制指令,通過串口上傳到顯示控制中心。程序設(shè)計流程圖如圖2所示。

          圖2 單片機(jī)程序流程圖

          2.2 FPGA程序設(shè)計

          FPGA是游戲的主控制器,完成了游戲的大部分功能,頂層設(shè)計文件中主要包括輸入顯示類模塊、VGA核心模塊、存儲模塊三類模塊。其中輸入顯示類模塊主要有分頻模塊、PS/2接收模塊、串口接收模塊、指令處理模塊、數(shù)碼管顯示模塊;存儲模塊包括基于FPGA 片上RAM的RAM和ROM模塊。頂層設(shè)計框圖如圖3所示。

          圖3 FPGA頂層設(shè)計框圖

          2.2.1 輸入顯示類模塊

          獨立按鍵用于模式的選擇、游戲難度的調(diào)節(jié)、由歡迎界面到游戲界面的切換;串口部分用于接收來自數(shù)據(jù)采集單元的控制指令,經(jīng)過譯碼模塊后送入模式選擇模塊;PS/2模塊用于接收鍵盤信號輸入并產(chǎn)生指令送入模式選擇模塊;數(shù)碼管用于顯示當(dāng)前的游戲模式、難度等級和獲得分?jǐn)?shù)。

          顯示器采用的分辨率為640×480 的,刷新頻率為60 Hz,根據(jù)VGA常見刷新頻率時序表可知,需要時鐘為25 MHz左右,板子輸入時鐘為50 MHz,經(jīng)過分頻模塊后可以提供25 MHz的時鐘。

          2.2.2 存儲模塊

          設(shè)計中,由于采用的是FPGA的片上RAM作為存儲介質(zhì),受到其162 Kb的約束,只能設(shè)計大小為256×256的單色界面。存儲的數(shù)據(jù)位寬為32位,共2 048個,地址線為11位。

          游戲界面因為要不斷修改,故存放在基于FPGA片上RAM的RAM模塊中。其可同時有讀寫使能,因此可以同時讀寫,即使同時讀寫同一個地址也不會出錯,而且還可以設(shè)置成讀寫地址線各自獨立,不用考慮時分復(fù)用使用地址線的問題。這樣在實際代碼中就可以將RAM的讀和寫完全獨立考慮,分別由掃描輸出模塊和數(shù)據(jù)處理模塊完成,兩者互不干擾。圖4是RAM的讀寫時序圖。

          圖4 配置RAM中讀寫數(shù)據(jù)時序圖

          開始界面由于是固定的,放入ROM 中,初始化ROM文件中的數(shù)據(jù)可通過Matlab處理得到?,F(xiàn)在有一些字模軟件雖然可以讀取要顯示的圖片,但給出的數(shù)據(jù)格式并不能初始化ROM的,因此,利用Matlab編寫了一段圖片處理程序,可以讀取圖片,然后經(jīng)過處理,生成一個可以直接復(fù)制到ROM初始化文件中的數(shù)組形式。這樣,使得圖片顯示操作簡單,圖片替換更容易。

          2.2.3 VGA控制模塊

          在游戲界面設(shè)計中,存在主要的難點:小方塊隨機(jī)間隔下落、難度等級設(shè)置等。

          在游戲中,為了增加游戲的難度,在設(shè)計中,小方塊的降落為兩個,而且是有一定的間隔、在隨機(jī)位置下落。小方塊的動態(tài)顯示是通過不斷修改RAM中要顯示圖像的數(shù)據(jù)來實現(xiàn)的。游戲中方塊的長為32 個像素(對應(yīng)RAM中存儲的數(shù)據(jù)位寬,方便修改),則界面中有8條下落路線,小方塊的下落是從界面頂端開始的,也就意味著RAM中的數(shù)據(jù)修改是從前8位的某一位開始的,因此實現(xiàn)隨機(jī)下落只需要產(chǎn)生一個1~8范圍的隨機(jī)數(shù)。在設(shè)計中,通過設(shè)計了一個偽隨機(jī)數(shù)產(chǎn)生器,生成一個9以內(nèi)的隨機(jī)數(shù)作為RAM修改數(shù)據(jù)的起始位。

          第二個小方塊的下落是通過設(shè)定一個標(biāo)志位Num2,當(dāng)?shù)谝粋€方塊下落到游戲界面的中間位置時,置位Num2,從而觸發(fā)了第二個小方塊的下落進(jìn)程,第二個方塊開始下落。其中,兩個小方塊下落修改數(shù)據(jù)的操作都是在VGA掃描的消隱階段完成的,因此每進(jìn)行一次幀掃描,小方塊下落1個像素。VGA刷新頻率為60 Hz,因此小方塊每秒會下落60個像素。

          當(dāng)游戲操作者漏接的方塊數(shù)據(jù)到達(dá)一定數(shù)目m,游戲結(jié)束。難度等級是通過設(shè)置被控制方塊左右移動靈敏度和漏接方塊數(shù)目m 來實現(xiàn)的。靈敏度越高,m 越小,游戲等級越高。

          2.3 通信編碼準(zhǔn)則

          單片機(jī)從加速度傳感器獲得的數(shù)據(jù)中提取出y 軸的加速度值,由此可以判斷出速度手套的此時的狀態(tài)。它送往串口的數(shù)據(jù)不是加速度值,而是編碼后的指令。具體的編碼譯碼原則設(shè)定如表1所示。

          表1 串口通信編碼準(zhǔn)則

          表1 中FPGA 譯碼是FPGA 的串口接收模塊獲得后,解碼之后送給VGA顯示模塊的指令。游戲中保持了傳統(tǒng)鍵盤的兼容性,具體實現(xiàn)是通過PS/2模塊根據(jù)鍵盤輸入信號產(chǎn)生與表格1中FPGA譯碼相同的指令,送給VGA顯示模塊,完成對游戲的控制。

          3 結(jié)語

          本文設(shè)計了一款基于FGPA的體感游戲,通過利用人體的動作完成對游戲的操作,利用VGA顯示技術(shù)來到達(dá)更好的類似虛擬現(xiàn)實的效果,同時系統(tǒng)也保持了對傳統(tǒng)游戲鍵盤操作的兼容性。

          游戲通過加入人體的互動,使得游戲者可以對游戲有一種身臨其境的感覺,增加游戲趣味性、交互性、構(gòu)想性,同時也使得參與者身體得到運動與鍛煉。

          游戲最后實現(xiàn)了常規(guī)游戲的基本功能,主要有歡迎界面與游戲界面的切換以及VGA顯示;速度手套模式與鍵盤模式的切換;計分系統(tǒng),包含分?jǐn)?shù)的顯示、清零等;游戲的難度等級設(shè)置、顯示以及游戲的結(jié)束;游戲的暫停、重新開始等功能等。最后在硬件平臺實現(xiàn),表明游戲具有可玩性、趣味性,并能使游戲者獲得較好的游戲體驗。



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();