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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 自制3D鼠標——讓鼠標脫離桌面實現(xiàn)控制

          自制3D鼠標——讓鼠標脫離桌面實現(xiàn)控制

          作者: 時間:2011-02-21 來源:網(wǎng)絡 收藏

          相信喜歡玩游戲的人對在計算機上玩CS等射擊游戲一定不會陌生,但是大家在玩的時候是否常感覺到操作不夠真實、使用不夠方便呢?因為對槍的移動、射擊等操作是利用“趴”在桌面上鼠標的移動和點擊實現(xiàn)的,然而真實的場面并不是這樣。于是筆者就想,能否做一種鼠標出來,它不僅能夠在水平方向上來回移動控制,而且還能在垂直平面上操作呢?經(jīng)過翻查大量的資料,筆者想出了一種利用加速度傳感器設計的方法來實現(xiàn)這種功能,讀者只需把做好的“鼠標”電路放進仿真槍中,扳機連上鼠標的左鍵開關(guān)就能夠在計算機前玩真人CS啦。

          我們平時用的鼠標只能夠在桌子平面上運動,而3D鼠標是一種新型的鼠標器,它不僅可以當作普通的鼠標使用,而且具有以下幾個特點:
          (1)具有全方位立體控制能力。具有前、后、左、右、上、下6個移動方向,而且可以組合出前右、左下等的移動方向。
          (2)功耗很低,外形可以比普通鼠標更小巧,使用更靈活。
          本電路主要采用的是MMA7260加速度傳感器,這是一個3軸的加速度傳感器,當傳感器感受到外界加速度的變化時便會輸出3組3維與加速度大小成正比的電壓信號。這3電壓信號進入AD轉(zhuǎn)換器,轉(zhuǎn)換成數(shù)字信號,然后經(jīng)處理產(chǎn)生鼠標移動的時序信號,通過PS/2接口傳給計算機。

          一、3D鼠標電路構(gòu)成
          本電路主要分成3部分,一部分是加速度傳感器的外圍電路,另一部分是3.3V供電電源以及鼠標與計算機的PS/2接口電路,最后一部分是MSP430F2013的最小系統(tǒng)。MSP430系列的單片機可以說是微控制器中的“環(huán)保之星”了,之所以說環(huán)保是因為它能夠節(jié)省我們寶貴的電能,是業(yè)界上功耗最低的單片機之一。
          MSP430單片機不僅有超低的功耗和出色的運算性能,而且有一個高精度AD轉(zhuǎn)換器,這是3D鼠標能夠準確快速把傳感器的輸出信號轉(zhuǎn)換成數(shù)字量進行處理的基礎是本電路設計的關(guān)鍵。電路如圖1所示。

          二、最小系統(tǒng)設計
          MSP430中的F2xx系列具有靈活的時鐘系統(tǒng),其芯片內(nèi)部集成增強型的DCO(數(shù)字控制振蕩器),并且其頻率可以被設定為0~16MHz之間任一數(shù)值,這樣單片機電路便可在沒有外了電路的穩(wěn)定性和抗干擾能力。只需要分別給Vcc接上+3.3V和Vss接上地,的最小系統(tǒng)便可按照設定的程序運行。

          三、加速度傳感器電路設計
          本電路采用MMA7260加速度傳感器,由于MMA7260的集成度很高,芯片內(nèi)部已經(jīng)集成了溫度補償、信號調(diào)理等電路,因此芯片外圍電路也十分簡單。X-out、Y-out、Z-out分別為加速度傳感器的3個輸出端,輸出信號大小與其對應軸上的加速度成線性關(guān)系。為了防止高頻干擾信號進入單片機的AD轉(zhuǎn)換器,筆者特意在信號輸出端分別加上了一階RC低通濾波器。另外,MMA7260還有2個引腳可以設置不同的量程,電路中此功能是由一個撥動開關(guān)來實現(xiàn)的,用戶可以根據(jù)實際情況來選擇不同的量程與靈敏度,設定方法如表1所示。

          四電源及PS/2接口電路設計
          由于在PS/2接口中有提供+5V的接部晶振或時鐘下正常工作,既降低了成本,又減少了電路的體積,并增強口電源,同樣的,與電腦通信的信號線也是+5V電平信號,但是MSP430和MMA7260都是3.3V供電和3.3V電平通信的。為了解決這個問題,筆者采用了以下方法:
          在電源上采用LDO芯片AS1117和若干個電容構(gòu)成一個5V轉(zhuǎn)3V的線性穩(wěn)壓電源,而電平轉(zhuǎn)換方面則是是采用一對三極管來實現(xiàn)此功能,原理如圖2所示。圖中左邊是3.3V電平的MSP430單片機的兩個IO口,分別設置成輸出和輸入,右邊是電腦5V的PS/2接口。當單片機的IO1輸出高電平3.3V時,三極管的Ube遠遠大于三極管的飽和壓降,于是此時三級管VT1飽和導通,DATA端的電壓接近于0V,所以輸出的是低電平。如果IO1輸出的是低電平,Ube為0V,三極管處于截止狀態(tài),這時DATA端就相當于接上一個10kΩ的上拉電阻,其電壓處于5V,是高電平。
          由上面分析可知,這個電平轉(zhuǎn)換器其實是一個反相器,因此在對單片機編程時需要注意這點,要把電平信號取反才會得到原來的信號。同理,當DATA端為輸出時,首先把IO1設置成低電平,把IO2設置成輸入,就可以通過IO2來判斷DATA的電平信號了。

          五、元件的選用
          電路中的IC1、IC2分別是芯片AS1117-3.3和MMA7260,筆者都采用的是貼片封裝,尤其是MMA7260,采用的是QFN封裝,如圖3所示。
          這種封裝并沒有一根根的引腳引出芯片外部,它采用的是焊盤結(jié)構(gòu),把一個個的焊盤放在芯片下方,所以很難在萬用板上焊接,為此筆者特意設計了一個加速度傳感器的模塊(電路見圖3,實物圖見圖4)。這樣,一來方便焊接,二來這個模塊日后還能運用到其他制作中去。
          本電路所有的電阻和小電容都是采用0805封裝的貼片電阻和電容(見圖5),而10μF的電容采用的是1206封裝的鉭電容。這些電容、電阻無論焊接到萬用板還是自己做的PCB上都十分容易,而且體積適中,非常節(jié)省板上位置。至于電路中的4個三極管VT1~VT4選用直插的、較高β值NPN型三極管即可,例如2N3904、9014等。輕觸開關(guān)S1、S2和PS/2接線都是筆者從廢舊鼠標中拆下的,十分環(huán)保。單片機MSP430F2013有兩種封裝,為了焊接方便,筆者選用的是DIP雙列直插的封裝,見圖6。

          六、安裝與調(diào)試

          MMA7260的焊接是本制作的一大難點,像這種QFN封裝的芯片最好用熱風槍來焊接,在焊接前要在芯片焊盤上用烙鐵均勻地焊上少量焊錫,焊錫不能太多,而且要均勻,高度一致,否則當芯片放在PCB上時會傾斜,影響焊接效果。其次,需要注意用熱風槍對芯片加熱時要均勻受熱,風口要在芯片上方不斷搖動,直到焊錫溶解。
          當加速度傳感器模塊上所有元塊,如果輸出的電壓有變化,則模塊工作正常。如果加速度模塊工作正常,就可以把所有的元件都按照電路圖在洞洞板上焊接起來,并向單片機燒寫程序。制作好的電路實物見圖7。因為F2XX系列的單片機支持SPY_BY_WIRE的兩線下載調(diào)試方式,所以程序下載調(diào)試都十分方便,通過IAR公司的IDE環(huán)境,可以很輕松地完成程序的編寫,編譯、下載、調(diào)試等的所有工作。
          如果你把上面所介紹的步驟都順利完成了,那就恭喜你啦,你可以把鼠標插入電腦的PS/2接口,并打開電腦,開始享受3D鼠標所給你帶來全新操作體驗了。
          后記:筆者制作的這個3D鼠標打破了鼠標只能在桌面上的2D范圍內(nèi)運動的局限,把鼠標的運動范圍擴展到空間,使鼠標的操作方式更加多樣、更加靈活、更加方便。有興趣的讀者歡迎一試!本制作所需相關(guān)程序可到《無線電》網(wǎng)站下載。

          手機電池相關(guān)文章:手機電池修復


          51單片機相關(guān)文章:51單片機教程


          低通濾波器相關(guān)文章:低通濾波器原理


          晶振相關(guān)文章:晶振原理
          上拉電阻相關(guā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); })();