金磊 賈浩楠 發自 凹非寺
量子位 報道 | 公眾號 QbitAI
20年前,電腦還是大背頭的,「休閒小遊戲」是屬於Windows的。
紙牌、掃雷、空當接龍……滿滿的一波回憶殺。
最近,來自美國肯尼索州立大學(KSU)的4位小哥,就親自動手用開源電子原型平台Arduino,從零開始復現了另一款Windows經典小遊戲——三維彈球 (3D Pinball)。
從3D建模,到代碼編寫,再到最後的動手施工,他們用最專業的手段向童年致敬。
正如其中一位小哥説的:
建造這樣一個項目,是我的童年夢想。
不僅如此,他們還把整個過程做了個教程——只要9步,你也可以打造一台屬於自己的三維彈球。
把「三維彈球」搬到現實中
我們先來回憶一波這款經典的Windows小遊戲。
開局,球會從右下角的管道被彈出,然後就會在桌面自由滾動,碰到不同的障礙物會拿到不同的分數。
只要保證它不從底部中間的縫隙掉出去就可以。
(滿滿的童年回憶啊……)
那麼,KSU幾位小哥打造的「三維彈球」,長啥樣?
模型是這樣的:
實物長這樣:
桌面佈局可以説是完美復現了小遊戲中的場景——從管道的位置,到障礙物的佈局,各種細節“惟妙惟肖”。
嗯,有內味道了。
實際上手玩耍又是種什麼體驗?
再來看下近距離視角。
簡直一摸一樣有木有!
然而這台機器還有更厲害的地方——全自動、多球。
看完是不是也想擁有一台呢?
彆着急,KSU的4位小哥寫了份超詳細教程,手把手教你如何打造現實版「三維彈球」。
9步,手把手教你打造現實版「三維彈球」
彈球機的主要功能模塊包括追蹤得分系統,多球彈珠機,還有自主啓動開關。上方有一個USB攝像頭,在自動運行模式下會持續地監測彈球的位置,並根據球的位置指揮擊打器。
用到的工具和材料清單:
數控機牀或激光切割機Dremel和砂紙烙鐵3D打印機Linux計算機USB攝像頭
大量的22/24 AWG線大量的熱縮線3/4英寸的膠合板(波羅的海樺木)一個電源降壓轉換器彈球組件(網上購買)
左右翻轉器組件2個翻轉式擊打器2個翻轉按鈕2個葉子開關保險槓總成2個彈弓組件至少6個星柱的彈弓至少2個2英寸的橡皮筋
發射器機制44號刺刀式燈場地中的障礙擲球器翻轉開關
Step 1:紙面設計和低成本試錯
設計中最可能出現的問題可能就是遊戲機本身的尺寸限制和內部結構的安排,一些預想的彈球擊打方式實驗時才發現無法實現,所以需要先畫出設計草圖,然後在此基礎上不斷改進。
團隊在確定最終的遊戲場地設計之前,經歷了多次設計的修改和優化,每一次改進,都在便宜的膠合板上做一個模型來測試,一步步靠近最終的設計。
一些經驗教訓:
進行模塊化設計,不同功能組件要能隨意放置和取消。不要自己設計滑輪,借鑑成熟的彈球遊戲的場地設計,這樣能少走很多彎路。
Step 2:在SolidWorks上進行設計建模
彈球機的設計由兩個主要的子部分組成,運動場和支架。球場是標準尺寸——20.25 x42英寸2,由3/4英寸厚度的波羅的海樺木膠合板製成。
遊戲場地包括一個由直徑為2英寸的亞克力管和3D打印的適配器組合而成的第二層。第二層有兩個主要功能。首先,第二層作為介質,將球從上層球場直接輸送到左翻板內側。球下落位置的可預測性,使得第二層成為一個的通道,此通道便於多球運動,這是其第二大功能。
當坡道和左內線上的翻轉開關背對背地觸發時,舵機會釋放出兩個球,這些球會下滾到第二層上方的兩個管子中的一個,與坡道射出的球發生碰撞。因此,在多球模式下,這些管子將球會送入第二層,進入入左邊的內管。
3/4英寸膠合板厚度的選擇是為了給工程提供足夠的剛性,並允許在承重接頭處有更大的緊固件齧合。選用波羅的海樺木作材料,因為它的質量高,雜質少,屬於硬木,不易損壞,易於使用激光雕刻,一般來説,對於較重的木製結構是首選。
支架是遊戲場地的安裝裝置,並容納了定製的電子裝置。電子裝置直接固定在底板上,延伸的延伸到遊戲面板底部。通過觀察窗可以看到電子裝置在支架的兩側。
此外,該支架還可以通過側面的可拆卸的插銷對球場進行間距調節。遊戲台傾斜角度範圍為0-8度,每兩度設置一個調節檔位。更高的球道坡度可以使遊戲節奏更快,難度更高。
Step 3:用數控機牀或激光雕刻製作主體
儘管你可以手工切削出遊戲台的整體結構,但這樣誤差交大,後續安裝連接多有不便,浪費材料。
這幾個美國小哥用一台大型5軸數控機牀進行銑削,最後再用木楔進行細節調整。
Step 4:電子器件和電源選擇
大多數彈球機的 “高壓 “在35V-48V的範圍,這取決於你買的電磁鐵的品牌,同時你要選擇一個能支持這種磁鐵線圈的電源。
其次,你需要考慮到 “低電壓 “的電源,用於給燈或其他較小的電器元件等東西供電。我們選擇的低電壓是6.3v的電壓,但這不一定是一成不變的。這要看你買的是什麼LED,以及你是否用這個電源給其他的電器東西供電。一般6.3V應該就可以滿足需要。
如果沒有低壓電源,那還需要一個降壓轉換器將高電壓(如48V)降到小元件的額定電壓。
此外,使用的元件的電阻大小,決定了電流大小。所以,電源總功率要視情況而定。
如果你的組件沒有達到正確的功耗額定值,這些元件在很短的時間內產生很大的電流。
在這種情況下,單個擊打器內部線圈可能會產生3-4安電流,兩個加起來8安培左右,會導致元件燒燬。
你應當計算出 “最壞的情況下 “的電流大小,然後給出一個合理的安全範圍,挑出一個對應的電源。
Step 5:建立I/O接口電路
開關輸入部分:
開關輸入板負責將所有的值從遊戲場地中讀入到Arduino。這個單獨的電路非常簡單,但需要對很多輸入進行放大處理。
因為Arduino有一個內部的上拉電阻,所以你可以如上圖那樣接線。
這裏最大的問題是要確保每個開關都有連接器,以防有一個開關因為某種原因單獨取出調試。
這個項目中使用了標準針腳連接,可以很容易地將所有的東西同時插入到Arduino中。
燈光控制部分:
電路由一個BJT晶體管(2n222222)、幾個電阻和LED組成。
晶體管作為一個數字 “開關”,可以打開或關閉,把它這個連接到前面提到的6.3v電源上,就得到了一個光源和單獨可尋址的LED。
不能直接將LED直接連接到Arduino上的原因是,Arduino無法提供多個LED要求的額定電流。
正確的辦法是把Arduino作為一個數字開關,控制BJT。這樣就可以將LED的數量擴大到我們需要的數量。
電磁控制部分:
總體思路與LED板相同:從Arduino發送一個信號,能夠打開/關閉任何一個電磁鐵(翻板、彈弓、彈出式保險槓)。因為這些元件比LED功率更大,所以需要一些更大的晶體管:MOSFET。
電路元件清單:
1k電阻10k電阻330電阻IRF44V MOSFET1N4004 二極管47微法電容
電磁鐵需要連接到48V的電壓才會啓動。
因為電感不能瞬間改變電流,這就帶來了一個問題。工作時,線圈會通過很高電流,而關閉時,如果沒有一個地方分散電流,可能會破壞元件,非常危險。
這裏使RC緩衝器電路和二極管來解決這個問題。要使它們覆蓋儘量多的電磁控制並聯支路。
擊打器和其他線圈的電路略有不同。這是因為,在彈球遊戲中,玩家有時會按住按鈕,以保持擊打器長時間啓動。如果要用同樣的功率線圈,很快就會燒燬。
在此電路中的第二個線圈可以實現快速第一次翻轉。一旦翻轉完成,一個機械機構會打開EOS開關,迫使電流通過兩個線圈。
Step 6:組裝所有元件
根據你遊戲場地的大小,焊接時間或長或短。這個項目花了大約兩天的時間焊接,並把所有器件安裝到位。
最終有5種連接器插到板子上:
高功率的螺線管電源與電磁鐵專用開關的連接與LED的連接與開關的連接一些輔助電源(5V、48V等)。
所有這些都插到了一個3D打印的連接板上,裏面封裝了所有電路設備。當需要開蓋檢測故障的時候,只需要拔掉5個大的連接器,然後把整個裝置舉起來。
Step 7:安裝Arduino軟件驅動
在這台機器上,需要在與Arduino相連的計算機上安裝以下依賴項:
ROSrosserial_arduino ROS packageOpenCV (c )TkinterApscheduler
整個軟件系統依靠ROS架構作為後端來回傳遞消息。
四個主要節點在彈珠機運行在自主模式下時,進行異步通信,以控制彈珠機的流程。
這些節點分別是Input_Output.ino、track_metal.cpp、run_low_level.py和GUI.py。
當不在自主模式下運行時,可以省略track_metal.cpp節點。
源代碼和詳細解釋在本項目的Github主頁放出。
Step 8:更改Pin、將代碼上傳到Arduino、更新USB攝像頭
如果你自己動手製作彈球機,並使用了本項目的源碼,要注意的是,你的Arduino的Pin需要更新兩處:Arduino/Input_Ouptut/Input_Ouptut.io,以及src/Classes/playfield.py。
此外還需要調整腳本,刪除對開關和LED的調用。
playfield.py會記錄有多少個項目,需要手動設置每個項目的Pin。
之後就可以將代碼上傳到Arduino中。此步驟必須安裝上一步中提到的rosserial_arduino,並正確設置Arduino IDE與ROS綁定。
最後,要做的是更新代碼中你自己使用的攝像頭名稱。只需在 src/Track/track_metal.cpp 中找到 “std::::string camera_metal.cpp “這一行:
“std::::string camera_string = “/dev/v4l/by-id/usb-046d_Logitech_Webcam_C930e_6D6BFE5E-video-index0”;”
將字符串更新為攝像機的名稱,可能是”/dev/v4l/by-id/“
所有步驟完成後,重新編譯才可以工作。
Step 9:玩起來吧!
如果一切正常,那麼找到到 “啓動 “目錄,然後輸入 “roslaunch automatic_pinball_c.report
這行代碼啓動所有與彈球機相關的節點,包括GUI節點和跟蹤球的位置的節點。
此外,你可以使用’roslaunch manual_pinball.report’不運行任何自主部分,只體驗手動模式。
來自KSU畢業班的四位“造夢者”
那麼,將童年回憶搬到現實的四位“造夢者”,都是何許人也?
Kevin Kamperman,今年畢業於KSU,目前正在佐治亞理工學院研究所實習,從事無人機相關的研究。
春季畢業的時候,Kevin Kamperman還被KSU評為今年的“榮譽畢業生”。
Cody Meier,同樣也是今年畢業於KSU,主修的專業是機械電子、機器人和自動化工程。
Omar Salazar和上一位小哥是同專業,也是主修機械電子、機器人和自動化工程。
他在採訪視頻中表示,這個項目加強了他在團隊合作方面的能力。
最後一位叫Tyler Gragg的小哥,可謂是“機器人制造”的狂熱愛好者,在個人介紹文字中,還特意寫道“Let’s Make Robots”,參與不少機器人項目。
Tyler也榮登了學校“光榮榜”。
嗯,是四位非常優秀的“造夢者”了。
那些年,經典的Windows小遊戲
紙牌、掃雷、空當接龍…….這些Windows經典遊戲至今仍然擁有眾多粉絲。
它們現在都何去何從了呢?
微軟如今把這些經典遊戲放在了WindowsStore中,然而「三維彈球」的就沒有那麼幸運了。
其實,從Win7開始,微軟團隊將原先的軟件全部移植到64位系統中。
然而,「三維彈球」卻出現了嚴重bug,為了節省時間,微軟直接放棄了這個遊戲。
但四位小哥的這個項目,卻賦予了這款經典之作新的生命。
這個星球有趣的人可真多啊。