本文经AI新媒体量子位(公众号ID: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,为了节省时间,微软直接放弃了这个游戏。
但四位小哥的这个项目,却赋予了这款经典之作新的生命。
这个星球有趣的人可真多啊。
传送门
现实版「三维弹球」项目地址:
https://www.instructables.com/id/Arduino-Pinball-Machine-That-Plays-Itself/
Github源代码地址:
https://github.com/Tdoe4321/AutoPinball
通用弹球游戏设计制作教程:
https://howtobuildapinballmachine.wordpress.com