帶無線控制器的乒乓球比賽 - 示意圖
自定義控制原理圖(基礎(chǔ))。查看完整尺寸版本。
無線控制器和乒乓球比賽工作
這個項目分為三個主要部分:控制器,服務(wù)器和乒乓球比賽。服務(wù)器本身很容易使用。不需要特殊的服務(wù)器代碼,因為它將要做的唯一工作是將數(shù)據(jù)包從控制器重新路由到乒乓球游戲。該項目的所有文件都以ZIP文件形式提供。
控制器
控制器本身只包含一個兼容RIOT的PIC器件(如PIC16F1516)和一些外部器件,包括功率調(diào)節(jié)和幾個開關(guān)。當(dāng)控制器打開時,器件配置為確保為ESP8266正確配置UART,在接收到UART字節(jié)時觸發(fā)中斷,內(nèi)部振蕩器處于最大速度,并且所有IO端口都配置為輸入或輸出。設(shè)置代碼完成后,微控制器需要啟動RIOTOUS并嘗試通過Wi-Fi連接到路由器(這是您需要填寫自己的詳細(xì)信息,包括SSID和密碼)。一旦建立了Wi-Fi連接,微控制器就會進(jìn)入循環(huán),不斷嘗試連接到我們的RIOTOUS服務(wù)器(同樣,您需要填寫托管RIOTOUS服務(wù)器的計算機的IP地址)。建立連接后,控制器會發(fā)送一條消息,讓服務(wù)器在其日志中顯示,并告知服務(wù)器其唯一ID。 RIOTOUS服務(wù)器根據(jù)它們所連接的端口識別設(shè)備,但每個連接的設(shè)備也可以具有唯一的ID。這個唯一ID與MAC地址的工作方式幾乎完全相同,如果兩個客戶端想要相互通信(例如,控制器和乒乓球游戲),它們都需要一個唯一的ID,然后要求服務(wù)器重新路由數(shù)據(jù)到具有唯一ID的設(shè)備。設(shè)置設(shè)備的唯一ID非常簡單,只需要兩個字節(jié):字母“I”和第二個字節(jié),其值代表唯一ID(0到255)。在我們的例子中,我們將控制器的唯一ID設(shè)置為“M”,因此將數(shù)據(jù)包發(fā)送到服務(wù)器“IM”。
一旦所有啟動代碼都有已執(zhí)行,主循環(huán)啟動。此循環(huán)只是查找按鈕按下并根據(jù)當(dāng)前按鈕狀態(tài)發(fā)送消息。上下按鈕僅在按下或釋放按鈕時發(fā)送消息,而每次代碼循環(huán)時,開始按鈕將發(fā)送消息。
游戲
游戲本身是使用名為Multimedia Fusion 2.5的程序制作的,是一個軟件包,可以在不使用代碼的情況下進(jìn)行游戲制作。盡管沒有使用代碼,但該軟件功能強大且比大多數(shù)人認(rèn)為的更靈活。程序是使用點擊式系統(tǒng)制作的,具有可配置的事件和操作,具有許多擴展,允許用戶執(zhí)行任何操作(包括網(wǎng)絡(luò),目錄搜索,系統(tǒng)進(jìn)程查看等)。雖然MMF2易于使用,但我建議您在進(jìn)行此項目之前嘗試更輕松的項目,因為您需要一些關(guān)于可變值和基本游戲練習(xí)的知識。
在我們的乒乓球在游戲中,我們利用了RIOTOUS小部件,它包含一個對象,兩個moo套接字和一些處理所有數(shù)據(jù)傳輸?shù)拇a。需要完成的第一項任務(wù)是更改RIOTOUS小部件的一些可變值。 “服務(wù)器IP”需要設(shè)置為RIOTOUS服務(wù)器的IP地址,“廣告端口”需要設(shè)置為廣告端口(默認(rèn)為333),“唯一ID”需要設(shè)置為唯一ID。游戲,將是“A。”
完成后,我們需要讓RIOTOUS小部件連接到游戲首次啟動時的RIOTOUS服務(wù)器,這是通過在觸發(fā)“開始幀”事件時將可更改字符串“Connect”設(shè)置為“true”來完成的。發(fā)生這種情況時,RIOTOUS會自動嘗試連接到服務(wù)器,如果成功,“ServerConnectionStatus”將等于“true”。
現(xiàn)在RIOTOUS小部件已將我們連接到服務(wù)器,我們等到用戶按下無線控制器上的開始按鈕,按下后,控制器將文本“RADBSTART”發(fā)送到服務(wù)器。服務(wù)器首先查看第一個字母并確定所請求的操作是什么。在這種情況下,第一個字母是R,表示重定向。下一個字母/字節(jié)是將消息重定向到的唯一ID(在本例中為A)。然后將其余數(shù)據(jù)發(fā)送到具有唯一ID(DBSTART)的設(shè)備。
當(dāng)客戶端(我們的游戲)收到此包時,它會查看第一個字母以確定數(shù)據(jù)包是什么。我們數(shù)據(jù)包中的第一個字母是D,代表“數(shù)據(jù)”,因此客戶端將數(shù)據(jù)包“DBSTART”放入其數(shù)據(jù)緩沖區(qū),并將“DataAvailable”變量設(shè)置為“true”。如果游戲檢測到此數(shù)據(jù)包,則啟用控制游戲的事件(玩家控制和游戲事件)。當(dāng)從RIOTOUS小部件讀取成功的數(shù)據(jù)時, 您必須清除緩沖區(qū)中的數(shù)據(jù)并將“DataAvailable”設(shè)置為false!
完成后,我們的游戲運行,按下按鈕可上下移動劃水板。但是,當(dāng)按下按鈕時,它只發(fā)送一條消息,因為微控制器的速度不足以反復(fù)向游戲發(fā)送移動數(shù)據(jù)。因此,在我們的游戲中,如果檢測到按鈕按下,則播放器將朝該方向移動 ,直到釋放按鈕 。這提供了平滑響應(yīng)控制的效果,并且由于控制器和游戲之間的延遲小于20ms,因此給人的印象是正在使用有線控制器。
您可能已經(jīng)注意到檢查可用數(shù)據(jù)的最后一個事件是否為真。關(guān)于MMF2的好處是事件按順序執(zhí)行,以便事件16始終在事件17之前執(zhí)行。在我們的示例中,如果已發(fā)送損壞的數(shù)據(jù)且沒有觸發(fā)任何數(shù)據(jù)事件,則最后一個數(shù)據(jù)可用事件將清除緩沖區(qū),以便新數(shù)據(jù)可以到達(dá)。游戲代碼本身不會被解釋,因為它是A)MMF2文件中的微不足道而B)不太重要。什么 重要的是RIOTOUS客戶端,服務(wù)器和MMF2之間的通信。
構(gòu)建
您可以使用許多不同的技術(shù)構(gòu)建此項目。第一個也是最簡單的方法是構(gòu)建一個RIOTOUS開發(fā)板(上面提供的原理圖)或者獲得一個RIOTOUS開發(fā)板(很快就可用)。但是,如果您需要個性化控制器,則可以使用不同的電路構(gòu)造技術(shù),包括面包板,條形板,矩形板和PCB??刂破餍枰嫒軷IOTOUS(》 4 MIPS,4KB ROM和256字節(jié)RAM),下面是控制器板PCB布局的示例。
通用控制器PCB的一個例子(需要按鈕和其他輸入的屏蔽)
此項目中使用的開發(fā)板(PIC16F1516)
-
無線控制器
+關(guān)注
關(guān)注
0文章
29瀏覽量
10936
發(fā)布評論請先 登錄
相關(guān)推薦
評論