给那些怀旧的游戏骨灰粉丝们：自制一台树莓派街机
================================================================================
**利用当代神奇设备来重温80年代的黄金记忆。**

### 你需要以下硬件 ###

- 一台树莓派以及一张4GBSD卡
- 一台支持HDMI的LCD显示屏
- 游戏手柄或者...
- 一个JAMMA街机游戏机外壳机箱
- J-Pac或者I-Pac

80年代有太多难忘的记忆；冷战结束，Quatro碳酸饮料，Korg Polysix合成器，以及Commodore 64家用电脑。但对于某些年轻人来说，这些都没有街机游戏机那样有说服力，或那种甜蜜的叛逆。笼罩着烟味和此起彼伏的8比特音效，它们就是在挤出来的时间里去探索的洞穴：50分钱和一个游戏币能让你消耗整个午餐时间，在这些游戏上磨练着你的技能：小蜜蜂，城市大金刚，蜈蚣，行星射击，吃豆小姐，火凤凰，R-Rype，大金刚，雷霆计划，铁手套，街头霸王，超越赛车，防卫者争战...噢，这个列表太长了。

这些游戏，以及玩这些游戏的街机机器，仍然像30年前那样有吸引力。不像年轻时候那样，现在可以不用装一兜零钱就能玩了，最终让你超越那些有钱的孩子以及他们无休止的‘继续游戏’。所以是时候打造一个你自己的基于Linux的街机游戏机了，然后挑战一下过去的最高分。

我们将会包括所有的步骤，来将一个便宜的街机游戏机器外壳变成一台Linux驱动的多平台复古游戏系统。但是这并不意味着你就一定要搭建一个同样的系统。比如说，你可以放弃那个又大又重还有潜在致癌性外壳的箱子本身，而是将内部控制核心装进一个旧游戏主机或同等大小的盒子里。或者说，你也可以简单地放弃小巧的树莓派，而将系统的大脑换成一台更强劲的Linux主机。举个例子，它可以作为运行SteamOS的一个理想平台，用来玩那些更优秀的现代街机游戏。

在之后的几个页面里，我们将搭建一台基于树莓派的街机游戏机，你应该也能从其中发现很多点子应用到你自己的项目上，即使它们和我们这个项目不太一样。然后因为我们是用无比强大的MAME来做这件事情，你几乎可以让它在任意平台上运行。

![](http://www.linuxvoice.com/wp-content/uploads/2014/08/picade3.png)

*我们是在B+型号出来以前完成的这个项目。它应该也可以同样工作在更新的主板上，你应该不用一个带电源的USB Hub也可以*

### 声明 ###

强调一下，我们捣腾的电子器件可能会让你受到电击。请确保你做的任何改动都是有资质的电子工程师帮你检查过的。我们也不会深入讨论如何获取游戏，但是有很多合法的资源，例如基于MAME模拟器的老游戏，以及较新的商业游戏。

#### 第一步：街机机柜 ####

街机机柜本身就是最大的挑战。我们在eBay上淘了个二手的90年代初的双人泡泡龙游戏机。然后花了£220装在一台旅行车后面送过来。类似这种机柜的价格并不确定。我们看到过很多在£100以内的。而另一方面，还有很多人愿意花数千块钱去买原版侧面贴纸完整的机器。

决定买一个街机机柜，主要有两个考虑。第一个是它的体积：这东西又大又重。又占地方，而且需要至少两个人才能搬动。如果你不缺钱的话，还可以买DIY机柜或者全新的小一点的，例如适合摆在桌子上的那种。然后，酒柜也能很合适。

![](http://www.linuxvoice.com/wp-content/uploads/2014/08/picade4.jpg)

*这种机柜可能很便宜，但是他们都很重。不要一个人去搬。一些更古老的机器可能还会需要一点小关怀，例如重新喷个漆以及一些修理工作*

除了获得更加真实的游戏体验以外，购买原版的街机机柜的一个绝佳理由是可以使用原版的控制器。从eBay上买到的大多数机器都支持两个人同时玩，有两个摇杆以及每个玩家各自的一些按钮，再加上玩家一和玩家二的选择按钮。为了兼容更多游戏，我们建议您找一台每个玩家都有6个按键的型号，这个是通用配置。也许你还想看看支持超过两位玩家的控制台，或者有空间放其他游戏控制器的，比如说街机轨迹球（类似疯狂弹珠这种游戏需要的），或者一个旋钮（打砖块）。这些待会都可以轻松装上去，因为有现成的现代USB设备。

控制器是第二考虑的，而且我们认为是最重要的，因为要通过它把你的摇动和拍打转变成游戏里的动作。当你准备买一个机柜时需要考虑一种叫JAMMA的东西，它是日本娱乐机械制造商协会（Japan Amusement Machinery Manufacturers Association）的缩写。JAMMA是街机游戏机里的行业标准，定义了包含游戏芯片的电路板和游戏控制器的连接方式，以及投币机制。它是一个连接两个玩家的摇杆和按钮的所有线缆的接口电路，把它们统一到一个标准的连接头。JAMMA就是这个连接头的大小以及引脚定义，这就意味着不管你安装的主板是什么，按钮和控制器都将会连接到相同功能接口，所以街机的主人只需要再更换下机柜上的外观图片，就可以招揽新玩家了。

但是首先，提醒一下：JAMMA连接头上带有12V电压供电，通常由大多数街机里都有的电源模块供给。为了避免意外短路或是不小心掉个螺丝刀什么的造成损坏，我们完全切断了这个供电。在本教程后面的任何阶段，我们也不会用到这个连接头上的任何电源脚。

![](http://www.linuxvoice.com/wp-content/uploads/2014/08/picade2.png)

#### 第二步：J-PAC ####

有一点非常方便，你可以买到这样一种设备，连接街机机柜里的JAMMA接头和电脑的USB端口，将机柜上的摇杆和按键动作都转换成（可配置的）键盘命令，它们可以在Linux里用来控制任何想玩的游戏。这个设备就叫J-Pac（[www.ultimarc.com/jpac.html][1] – 大概£54）。

它最大的特点不是它的连接性；而是它处理和转换输入信号的方式，因为它比标准的USB手柄强太多太多了。每一个输入都有自己独立的中断，而且没有限制同时按下或按住的按钮或摇杆方向的数量。这对于类似街头霸王的游戏来说非常关键，因为他们依赖于同时迅速按下的组合键，而且用来对那些发飙后按下自己所有按键的不良对手发出致命一击时也必不可少。许多其他控制器，特别是那些生成键盘输入的，受到了他们所采用的USB控制器的同时六个输入的限制，以及一堆的Alt，Shift和Ctrl键的特殊处理的限制。J-Pac还可以接入倾角传感器，甚至某些投币装置，不用预先配置就可以在Linux下工作了。

另外的选择是一个类似的叫I-Pac的设备。它做了和J-Pac相同的事情，只不过不支持JAMMA接头。这意味着你不能把JAMMA控制器接上去，但同时也就是说你可以设计你自己的控制器布局，再把每个控制接到I-Pac上去。这对第一个项目来说也许有点小难，但是这却是许多街机迷们选择的方式，特别是他们想设计一个支持四个玩家的控制板的时候，或者是一个整合许多不同类型控制的面板的时候。我们采用的方式并不是我们推荐必须要做的，我们改造了一个输入有问题的二手X-Arcade Tankstick控制面板，换上了新的摇杆和按钮，再接到新的JAMMA接口，这样有一个非常好的地方就是可以用便宜的价格（£8）买到所有用到的线材包括电路板边缘插头。

![](http://www.linuxvoice.com/wp-content/uploads/2014/08/picade5.jpg)

*上图是我们已经装到机柜上的J-Pac。右边的蓝色和红色导线接到我们的机柜上额外的1号和2号玩家按钮*

不管你选择的是I-Pac或是J-Pac，它们产生的按键都是MAME的默认值。也就是说运行模拟器之后不需要手动调整输入。例如玩家1，会默认将键盘方向键映射成上下左右，以及将左边的Ctrl，左边的ALT，空格和左边的Shift键映射到按钮1-4。但是真正实用的功能是，对于我们来说，是双键快捷方式。当按下并按住玩家1按钮后，就可以通过把玩家1的摇杆拉到下的位置发出用来暂停游戏的P按键，推到上的位置调整音量，以及推到右的位置来进入MAME自己的设置界面。这些特殊组合键设计的很巧妙，不会对正常玩游戏带来任何干扰，因为他们只有在按住玩家1按钮后才会生效，然后可以让你正在运行游戏的时候也能做任何需要的事情。例如，你可以完全地重新配置MAME，使用它自己的菜单，在玩游戏的时候改变输入绑定和灵敏度。

最后，按住玩家1按钮然后按下玩家2按钮就可以退出MAME，如果你使用了启动菜单或MAME管理器的话就很有用了，因为他们会自动启动游戏，然后你就可以用最快的速度开始玩另一个游戏了。

对于显示屏我们采取了比较保守的方式，拿掉了街机原装的笨重的而且已经坏掉的CRT，换成一个低成本的LCD显示器。这样做有很多好处。首先，这个显示器有HDMI接口，这样他就可以轻易地直接连接到树莓派或是现代的显卡上。第二，你也不用去设定驱动街机屏幕所需要的低频率刷新模式，也不需要驱动它的专用图形硬件。第三，这也是最安全的方式，因为街机屏幕往往在机身背后没有保护措施，让很高的电压离你的手只有几英寸的距离。也不是说你完全不能用CRT，如果那就是你追求的体验的话 – 这也是获得所追求的游戏体验的最真实的方式，但是我们在软件里充分细调了CRT模拟部分，我们对输出已经很满意了，而且不需要用那个古老的CRT更是让我们高兴。

你也许还需要考虑用一个老式的4:3长宽比的LCD，而不是那种宽屏的现代产品，因为4:3模式用来玩竖屏或横屏的游戏更实用。比如说玩竖屏的射击游戏，例如雷电，如果使用宽屏显示器的话，会在屏幕两边都有一个黑条。这些黑条一般会用来显示一些游戏指引，或者你也可以把屏幕翻转90度，这样就可以用上每个像素了，但这却不实用，除非你只玩竖屏游戏或者有一个容易操作的旋转支座。

装载显示屏也很重要。如果你拿掉了CRT的话，没有现成的地方安装LCD。我们的方式是买了一些中密度纤维板(MDF)并切割成适合原来摆放CRT的地方。固定以好，我们把一个便宜的VESA支座放在中间。VESA底座可以用来挂载大多数屏幕，大的或小的。最后，因为我们的机柜前面有烟玻璃，我们必须保证亮度和对比度都设置的足够高。

### 第三步：装配 ###

现在几个硬件大件都选好了，而且也基本上确定了最终街机机柜要摆放的地方，把这几个配件装到一起并没有太大难度。我们安全地把机柜后面的电源输入部分拆开，然后在背后的空间接了一个符合插座。接在了电源开关之后的电线上。

几乎所有的街机机柜右上角都有个电源开关，但通常在机柜靠下一点的地方有大量的导线铰接在它上面，也就是说我们的设备可以使用普通的电源连接头。我们的机柜上还有一个荧光管，用做机器上边灯罩的背光，之前是直接连接到电源上的，我们可以用一个普通插头让它保持和电源连接。当你打开机柜上的电源开关的时候，电流会流入机柜里的各个部件 - 你的树莓派和显示屏都会开机，所有一切就都准备好了。

J-Pac模块直接插到JAMMA接口上，但你可能还需要一点手动调整。标准的JAMMA只支持每个玩家最多三个按键（尽管许多非正式的支持四个），而J-Pac可以支持六个。为了连接额外的按钮，你需要把按钮开关的一端接到J-Pac的GND上，另一端接到J-Pac板边有螺丝固定的输入上。它们被标记成1SW4，1SW5，1SW6，2SW4，2SW5和2SW6。J-Pac也有声音的直通连接，但是我们发现杂音太多没法用。改成把机柜上的喇叭连接到一个二手的SoundBlaster功放上，再接到树莓派的音频输出端口。声音不一定要纯正，但音量一定要足够大。

![](http://www.linuxvoice.com/wp-content/uploads/2014/08/picade6.jpg)

*我们的树莓派已经接到J-Pac左边，也已经连接了显示屏和USB hub*

然后把J-Pac或I-Pac模块通过PS2转USB连接线接到你的PC或树莓派，也可以直接接到PC的PS2接口。要用旧的PS2接头的话额外还有个要求，你的电脑得足够古老还有这个，但是我们测试发现用USB性能是一样的。当然，这个不能用于不带PS2的树莓派，而且别忘了树莓派也需要供电。我们一般建议使用一个带电源的USB hub，因为没有供电是树莓派不工作最常见的错误。你还需要保证树莓派的网络正常，要么通过以太网（也许使用一个藏到机柜里的电力线适配器），或者通过无线USB设备。网络很关键是因为在树莓派被藏到机柜里后你还可以重新配置它，不用接键盘或鼠标就可以让你调整设置以及执行管理任务。

> ### 投币装置 ###

> 在街机模拟社区里，让投币装置工作在模拟器上工作就会和商业产品太接近了。这就意味着你有潜在的可能对使用你机器的人收取费用。这不仅仅只是不正当，考虑到运行在你自己街机上的那些游戏的来源，这将会是非法的。这很显然违背了模拟的精神。不过，我们和其他热爱者觉得一个能工作的投币装置更进一步地靠近了街机的真实，而且值得付出努力来营造对那个过去街机的怀念。丢个10便士硬币到投币口然后再听到机器发出增加点数的声音，没有什么比得上这种感受了。

> 实际上难度也不大。取决于你街机上的投币装置，以及它如何发信号通知投了几个币。大多数投币装置分为两个部分。较大的一部分是硬币接收和验证装置。这是投币过程的物理部分，用于检测硬币是否真实以及确定它的价值。这是通过一个游戏点数逻辑电路板来实现的，通常用一个排线连接，上边还带有很多DIP开关。这些开关用来决定接受哪种硬币，以及一个硬币能产生多少点数。然后就是简单地找到输出开关，每个点数都会触发它一次，然后把它接到JAMMA连接头的投币输入上，或者直接接到J-Pac。我们的投币装置型号是Mars MS111，在90年代早期的英国很常见，网上有大量关于每个DIP开关作用的信息，也有如何重新编程控制器来接受新硬币的方法。我们还能在这个装置的12V上接个小灯用来照亮投币孔。

#### 第四步：软件 ####

MAME是这种规模项目唯一可行的模拟器，它如今支持运行在数不清的不同平台上的各种各样的游戏，从第一代街机到一些最近的机器。从这个项目中还孕育出了MESS，一个多模拟器的超级系统，针对的平台是80到90年代的家庭电脑以及电视游戏机。

如何配置MAME本身都可以写上六页的文章了。它是一个复杂的，无序的，伟大的软件程序，模拟了如此之多的CPU，声卡，芯片，控制器以及那么多的选项，就像MythTV，你都永远不能真正配置好它。

但是也有个相对省事的方式，一个特别为树莓派构建的版本。它叫PiMAME。它是一个可下载的发布版和脚本，基于Raspbian，这是树莓派的默认发布版。它不仅仅会把MAME装到树莓派上（这很有用因为没有哪个默认仓库里有这个），还会安装其他一些精选出来的模拟器，并通过一个前端来管理他们。MAME，举个例子，是一个有数十个参数的命令行应用。但是PiMAME还有一个妙招 - 它安装了一个简单的网页服务器，可以在连接上网络后让你通过浏览器来安装新游戏。这是一个很好的优点，因为把游戏文件放到正确的目录下是使用MAME的困难之一，这还能让你连接到树莓派的存储设备得到最优使用。还有，PiMAME会通过用来安装它的脚本更新自己，所以保持最新版本就太简单了。目前来说这个非常有用，因为在编写这个项目的时候，正好在0.8版这样一个重大更新发布的时间点上。我们在三月份早期时发现有一些轻微的不稳定，但是我们确定在你读到这篇文章的时候一切都会解决。

安装PiMAME最好的方式就是先装Raspbian。你可以通过NOOBS安装，使用电脑上的图形工具，或者通过dd命令把Raspbian的内容直接写入到你的SD卡中。就像我们上个月的BrewPi教程里曾提到的，这个过程在之前已经被记录过很多次，所以就不再浪费口水了。想简单点就装一下NOOBS，参照树莓派网站上的指引。在装好Raspbian并跑起来以后，请确保使用配置工具来释放SD卡上的空间，以及确保系统已经更新到最新（`sudo apt-get update; sudo apt-get upgrade`）。然后再确保已经安装好了git工具包。当前任意Raspbian版本都会自带git，不过你仍然可以通过命令`sudo apt-get install git`检查一下。

然后再在终端里输入下面的命令把PiMAME安装器从项目的GitHub仓库克隆到本地：

    git clone https://github.com/ssilverm/pimame_installer

之后，如果命令工作正常的话你应该能看到如下的反馈输出：

    Cloning into ‘pimame_installer’...
    remote: Reusing existing pack: 2306, done.
    remote: Total 2306 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (2306/2306), 4.61 MiB | 11 KiB/s, done.
    Resolving deltas: 100% (823/823), done.

这个命令会创建一个叫‘pimame_installer’的新目录，然后下一步就是进入这个目录再执行它里面的脚本：

    cd pimame_installer/
    sudo ./install.sh

这个命令会安装和配置很多软件。所需的时间长短也取决于你的因特网速度，因为需要下载大量的包。我们那个简陋的树莓派加15Mb因特网连接用了差不多45分钟来执行完这个脚本，在这之后你会收到重启机器的提示。你现在可以安全的通过输入`sudo shutdown -r`来重启了，因为这个命令会自动处理剩下的SD卡写入操作。

这就是安装的全部事情了。在重启树莓派后，就会自动登录，然后会出现PiMAME启动菜单。在0.8版本里这是个非常漂亮的界面，有每个支持平台的图片，还有红色图标提示已经安装了多少个游戏。现在应该可以用控制器来操作了。如果需要检查控制器是否正确连接，可以用SSH连接到树莓派然后检查一下文件**/dev/input/by-id/usb-Ultimarc_I-PAC_Ultimarc_I-PAC-event-kbd**是否存在。

默认的按键配置就可以让你选择要在你的街机上运行哪个模拟器。我们最感兴趣的就是第一个，名字叫‘AdvMAME’，不过你也许会很惊讶看到还有一个MAME可选的，MAME4ALL。MAME4ALL是特别为树莓派构建的，使用了旧版的MAME源代码，所以它所支持的ROMS的性能也是最佳的。这是很合理的，因为你的树莓派不可能玩那些要求很高的游戏，所以没有理由苛求模拟器的没必要的兼容性。现在剩下的事情就是找些游戏装到你的系统里（参考下面的方法），然后尽情享受吧！

![](http://www.linuxvoice.com/wp-content/uploads/2014/08/picade1.png)

--------------------------------------------------------------------------------

via: http://www.linuxvoice.com/arcade-machine/

作者：[Ben Everard][a]
译者：[zpl1025](https://github.com/zpl1025)
校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出

[a]:http://www.linuxvoice.com/author/ben_everard/
[1]:http://www.ultimarc.com/jpac.html
