你有沒有覺得有必要吹掉一些蒸汽,釋放你內心的孩子,或者只是重溫從你的街機輝煌的日子粉碎東西的快感?進入正常!這款游戲是對經典打地鼠游戲的高科技改造,融合了懷舊和工程學。
我們從頭開始制作這款街機游戲:一個激光切割的木制盒子,里面裝著九個氣缸。但這不僅僅是蠻力,我們用磁鐵和3D磁傳感器取代了傳統(tǒng)的機械開關,使撞擊檢測快速而精確。當然,我們也不能只使用自己3D打印的錘子,這樣就能承受最激烈的游戲玩法。我們還提供了完整的構建指南:組裝、編碼和校準。準備好開始了嗎?
游戲概述
在嘉年華上玩過打地鼠嗎?假鼴鼠會從不同的洞里鉆出來每次鉆出來,你就試著敲它。正常!《T》將這一概念現代化:玩家擊碎由壓縮空氣驅動的隨機彈出的9個氣動活塞。但這不是你爺爺的街機游戲:
智能命中檢測:活塞上的磁鐵與英飛凌最新系列的TLE493D磁性傳感器相互作用,取代機械開關,實現即時、精確的命中。
自動游戲流程:xmc4700 Relax Lite kit微控制器套件是游戲的大腦,并使用OPTIGA?TrustMsecurity芯片隨機化活塞定時。活塞的氣動閥由使用單芯片的TLE94112ES 12倍半橋控制!最重要的是,游戲中的DPS368壓力傳感器和3d打印的錘子會在錘子被舉起時觸發(fā)游戲開始。
時間和得分跟蹤:一個雙位數的7段顯示剩余的比賽時間和你的最終得分。
它是如何工作的
開始:舉起錘子→DPS368測量錘子與游戲底座的高度差,觸發(fā)游戲開始倒計時5秒。
播放:15秒倒計時開始→OPTIGA?Trust M芯片隨機分配活塞→TLE94112ES激活閥門→活塞彈出。
得分:敲擊活塞→TLE493D檢測磁感應→XMC4700點燃下一個活塞并增加得分。
接下來是什么?我們將開始建立和測試9活塞氣動系統(tǒng),然后整合3D磁傳感機制,添加雙7段顯示,最后我們3D打印智能錘子和組裝成一個拋光街機準備的游戲。
硬件
氣動系統(tǒng):
此版本中的氣動系統(tǒng)基于Hackster項目:使用單個芯片驅動氣動系統(tǒng)。按照這個指南來創(chuàng)建你的主干!T游戲。
步驟2:將氣動系統(tǒng)變?yōu)榛顒踊钊?/strong>
為了準備傳感器測試,我們現在將轉向組裝。確保所有的激光切割部件和3d打印部件都準備好了,因為從現在開始,它們將在每一步中使用(請參閱附件中的設計文件)。
讓我們從組裝活塞外殼開始,它由激光切割的部件與9個活塞和傳感器的切口粘合在一起。之后,我們放置3d打印的活塞導軌,將它們鎖定在適當的位置,防止旋轉。我們還增加了一些填充物的活塞支持,以幫助吸收沖擊。
接下來,我們將9個活塞放入各自的插槽中,并將磁鐵粘在它們身上,因為它們將在接下來的構建中發(fā)揮重要作用。請注意,在照片中,我們也組裝了側墻,這是激光切割,也可以附加在最后的組裝。
接下來,我們放置9個活塞墊,擰緊支撐活塞的木板。這塊板作為運動活塞和氣動系統(tǒng)之間的中間層。最后,你可以把活塞系統(tǒng)安裝到氣動系統(tǒng)上,就可以進行測試了。
現在你已經成功地制造了活塞和氣動系統(tǒng)!隨后,我們將添加OPTIGA?Trust M芯片來隨機化活塞行為。你會注意到活塞的木制外殼上有一些切口。這些切口是為3D磁傳感器的支架設計的
3D磁傳感器可以測量三個方向的磁場:X, Y和z。我們將在9個活塞之間放置4個傳感器,這樣就可以檢測到任何一個活塞受到撞擊時磁場的變化。
在圓柱體的底部,我們放置了磁鐵。這些磁鐵能讓我們探測到圓柱體被擊中的時間。
磁鐵被放置在盡可能靠近3D磁傳感器的地方,以確保磁場足夠強,能夠被準確檢測到。對于傳感器,我們使用3D磁傳感器的切割板。在附件的Fritzing文件中提供了接線說明。
四個傳感器安裝在支架上,如下圖所示。
現在,我們可以把傳感器支架放在氣動系統(tǒng)里。
為了使組裝更實用,我們創(chuàng)建了一個帶連接器的小板。布線如圖所附的fritz文件所示;按照這些方法進行正確的連接。
現在我們可以把底板與9個氣缸在組裝和關閉一切的頂部。有了這一步,游戲的機制部分就完成了,可以進行測試了。
最后,我們可以測試9個活塞和磁傳感器(測試代碼在附件文件中提供)。之后,我們可以移動到7段屏幕的顯示部分。
分數顯示
我們使用兩個相互連接的7段數字來顯示游戲中的剩余時間和最終比分。我們將把顯示器安裝在“搞怪!”T游戲,這是設計來保持它。開始組裝激光切割的木制部件如下所示。一旦框架準備好,將7段顯示器安裝到木板上,并通過木板布線,在那里它們將連接到XMC微控制器。
讓錘子更聰明
錘子是擊打的關鍵部分!T游戲。為了檢測錘子何時被舉起,我們使用了兩個DPS368空氣壓力傳感器:一個傳感器放置在錘子內部。另一個被放置在里面!T框作為參考。
通過測量兩個傳感器之間的壓力差,我們可以測量錘與游戲之間的高度差,精度為±2厘米,并檢測錘何時被舉起。壓力傳感器接線圖在工程文件中提供。
對于錘子組件,您可以使用提供的3d打印部件。stl文件。這里有一些建議:水平打印錘子以獲得更好的穩(wěn)定性。將填充量增加到50%以增加重量和提高耐久性,將壁厚增加到2.4mm以增加堅固性。在電纜隧道區(qū)域(錘身)增加支架擋塊,避免支架難以拆除。
錘子由三部分組成:主錘體和兩個柔性TPU帽。這些蓋子可以在激烈的游戲過程中保護游戲免受損害。
在錘子的頂部,有放置DPS368壓力傳感器的空間。只需將傳感器推到位,如下圖所示:
另一個傳感器可以放置在任何地方。T游戲基地。
推動游戲發(fā)展
XMC4700放松套件需要5 V電源,顯示器工作在12 V,壓縮機和閥門都需要9 V電源。為了實現必要的電壓轉換,需要一個降壓轉換器從9v降壓到5v,從9v升壓到12v
為此,我們使用兩個TLD5190 VOLT DEMO評估板。這些板允許您通過調整板上微調器來選擇所需的輸出電壓。有關設置和使用這些評估板的詳細說明,TLD5190 VOLT DEMO評估板的用戶手冊提供了全面的解釋。
你可以通過向左轉動微調器來增加電壓,通過向右轉動來降低電壓。
軟件
現在讓我們一步一步地分解我們的Arduino代碼!首先,我們將闡明如何單獨使用和測試每個組件,然后我們將解釋整個應用程序代碼的Whack!T游戲。
第1部分:組件代碼
7段顯示代碼
游戲開始前會出現5秒倒計時。游戲在這個倒計時后開始,另一個15秒倒計時從那里開始。在這段時間里,你必須盡可能多地打汽缸。在第二次倒計時結束時,你的最終得分顯示-所有這些都是使用7段顯示。為了測試這兩個7段數字,我們使用了下面的示例代碼。我們所做的唯一修改是將引腳分配更改為50 (segmentLatch), 51 (segmentData)和52 (segmentClock)。
代碼Optiga?信任M盾2go
Optiga?Trust M芯片在這里用于生成(真實且加密安全的)1到9之間的隨機值,這是我們項目中的關鍵一步,因為它檢測到哪個圓柱體會彈出,使游戲變得不可預測和具有挑戰(zhàn)性。但在此之前,我們需要了解芯片的工作原理。
我們首先修改Optiga?Trust M Arduino庫中的一個示例,使其適應我們的需求。首先,讓我們看一下這段代碼的基礎:
頭文件和定義
要開始,我們需要包含“OPTIGATrustM.h”庫,它使我們能夠訪問TrustM功能。我們定義了隨機數生成的最大字節(jié)長度-將其設置為8確保我們一次可以生成最多8個隨機字節(jié)。
一個額外的調整:默認代碼包括彩色輸出(來自“fprint.h”),但為了簡單起見,我們選擇禁用它。
設置函數
一切就緒后,是時候初始化芯片了。setup功能確保Trust M板準備好生成安全隨機數。
這里有一個有趣的特性是電流限制——這個設置會影響主板的運行速度。如果我們增加電流限制,電路板就會加速。對于這個設置,我選擇了8 mA的限制(setCurrentLimit(8)),以便在性能和穩(wěn)定性之間取得更好的平衡。
循環(huán)函數:生成隨機數
每次循環(huán)運行時,Optiga?Trust M模塊通過函數getRandom(RND_MAXLENGTH, rnd)提供8字節(jié)的隨機數據。但是我們需要一個介于1和9之間的數字,因此我們將原始字節(jié)數組轉換為int64_t數字(convertByteArrayToInt64()),并使用對9 + 1取模將其映射到我們想要的范圍。這確保了我們總是在目標范圍內得到結果。
結果看起來像這樣:
3D磁傳感器代碼
這部分在我們的Hackster文章中有很好的記錄:下一代TLE493D: 3D磁感測指南,但對于這個特定的項目,我們需要使其適應XMC4700微控制器。
在深入游戲機制之前,我們需要測試所有四個傳感器,以驗證它們是否正確連接和運行。下面的代碼是專門為快速診斷設計的,允許我們檢查每個傳感器是否可操作。使用四個#define語句,我們可以激活或停用單個傳感器以進行測試。我們還定義了numavg,它決定了在計算平均值之前測量每個傳感器的次數。
平均傳感器值
一旦初始化,循環(huán)函數不斷地從傳感器讀取數據。函數average_sensor_value()測量多個讀數的值并取平均值,以獲得更穩(wěn)定的輸出。
傳感器的內置函數getTemperature()和getMagneticField()用于提取數據,而計時函數測量收集50個值所需的時間。
ps傳感器代碼
在我們的比賽中,時機就是一切。在玩家準備好之前,游戲不應該開始——這就是DPS傳感器的作用所在。這些傳感器用于檢測錘子何時被舉起,發(fā)出倒計時開始的信號。
為了實現這一點,我們使用了兩個DPS傳感器:一個傳感器放置在錘子內部來跟蹤它的運動。
第二個傳感器仍然固定在打!T設置,作為參考點。
關于如何使用傳感器的詳細解釋也可以在這篇Hackster文章中找到,但這里是我們如何在我們的項目中實現它。
頭文件和對象
Dps3xx.h包含在#include中,創(chuàng)建兩個Dps傳感器對象:
設置/循環(huán)
在我們追蹤錘子的運動之前,我們需要初始化傳感器并建立基線讀數。
設置功能確保兩個傳感器都正確初始化。
由于兩個傳感器在不同的位置,它們的壓力讀數自然會不同。這種差異可能相當于高達8米的高度差異,因此我們首先計算一個初始參考差作為基線。
高度差是在ight()函數中計算的,稍后我們將使用該函數來檢測運動。如果高度差大于10厘米,游戲將開始。
通過使用這兩個DPS傳感器,我們創(chuàng)造了一個直觀的游戲啟動機制。玩家不需要按下按鈕或打開開關——當他們把錘子舉得足夠高時,游戲就會自動開始。
Part 2: Code for Whack!T游戲
顯示屏設置為顯示游戲時間和分數,而DPS和3D磁傳感器分別用于檢測舉起錘子和成功擊中。為了建立一個可靠的參考,在比賽開始前記錄初始傳感器值。
DPS傳感器-檢測當錘子被舉起,信號的游戲開始。
3D磁傳感器-跟蹤撞擊時,活塞被擊中。
多半橋和執(zhí)行器-控制彈出的活塞,讓玩家擊中。
壓縮機—提供空氣壓力以移動活塞。
顯示-顯示比賽時間和比分更新。
設置
在操作開始之前,需要初始化系統(tǒng)的所有組件。setup()函數負責這一點,準備顯示器、傳感器和執(zhí)行器。
顯示屏設置為顯示比賽時間和分數,而DPS和3D傳感器配置為檢測錘的運動和成功命中。為了建立一個可靠的參考,在游戲開始之前記錄初始傳感器值(measure_initial_values())??刂曝撠熞苿踊钊膱?zhí)行器的多半橋(MHB)通電,壓縮機開始積聚空氣壓力(kompressor.start()),確?;钊軌蛘R苿印?
短暫的延遲可以讓所有組件在游戲進入主循環(huán)之前穩(wěn)定下來。幾個關鍵文件管理游戲的不同方面:display.hpp處理顯示功能,airpressure_sensor.hpp處理來自空氣壓力傳感器的數據,3d_sensor.hpp檢測圓柱體何時被擊中,push.hpp控制執(zhí)行器,game_matrix.hpp管理活塞運動的核心游戲邏輯。
GameLoop
一旦設置好一切,游戲便進入主循環(huán),在此它將持續(xù)監(jiān)視玩家的行動,更新顯示內容并管理游戲邏輯。
游戲如何在循環(huán)中運行:
1?游戲計時器管理
函數getRemainingSeconds()檢查還剩下多少時間。
如果游戲處于活動狀態(tài)(start_counting == true)并且還有剩余時間,它會在屏幕上顯示倒計時。
如果計時器達到零,游戲將存儲最終分數,重置命中計數器,并為新一輪做好準備。
2?.命中檢測與計分
命中檢測是基于磁場的變化。當氣缸的頂部位置與其當前位置之間的差值超過0.1 mT時,將記錄命中(compare_difference(piston_now, 0.1))。
分數是用game_hit_counter實現的。
3?.氣缸體爆破機構
游戲使用calculate_average(piston_now)連續(xù)檢查活塞運動。
一旦檢測到撞擊,系統(tǒng)隨機選擇一個活塞(1到10),并使用push(random(1,10))激活它。
這讓游戲變得不可預測,確保玩家不知道下一個圓柱體會彈出哪個圓柱體,從而保持他們的沉浸感。
4? .游戲結束并重新開始
如果計時器跑完,將顯示最終分數,游戲將等待錘子再次被舉起,然后重新開始。
這種平滑的過渡確保了無縫的游戲體驗,而無需額外的按鈕或手動重置。
倒數計時器
正常!游戲采用倒計時計時器,確保每回合持續(xù)固定時間(15秒)。getRemainingSeconds()函數通過測量游戲開始后經過的毫秒數來計算剩余時間。如果經過的時間超過倒計時持續(xù)時間,則返回0。
開始新游戲
在start_game()函數中,我們檢查游戲是否處于非活動狀態(tài)(start_counting ==false),然后啟動倒計時。當倒計時達到0時,游戲開始,記錄開始時間(startMillis),設置游戲持續(xù)時間,并啟用倒計時。
該系統(tǒng)確保平穩(wěn)和自動啟動,無需手動輸入。
現在我們可以結束了!所以T游戲代碼,一切就緒,游戲就準備開始了!拿你的錘子瞄準一些汽缸!!
本文編譯自hackster.io





