1. 项目缘起:为什么是GamePi13?
最近在折腾一个老项目,翻出来一块闲置的树莓派3B+,琢磨着给它找个新归宿。刷机、做NAS、当下载机这些常规操作都玩腻了,总想整点更有趣的。正好手头还有几个旧手柄,一个便携屏幕,一个念头就冒出来了:能不能把这些零散部件攒起来,做成一个能揣兜里带走的复古游戏机?不是那种简单的模拟器前端,而是从外壳、按键、供电到系统都自己动手,真正“攒”出来的那种。
这个想法就是“GamePi13”的起点。名字里的“GamePi”很好理解,基于树莓派的游戏机;“13”则是我个人偏好的一个数字,也代表了这个项目在我折腾清单上的序号。它本质上是一个高度定制化的便携式复古游戏机解决方案,核心是利用树莓派强大的社区生态和开源模拟器,将童年记忆里的红白机、GBA、PS1甚至部分PSP游戏,浓缩进一个巴掌大小的设备里。整个过程,从硬件选型、外壳设计(或改造)、系统配置到按键映射,每一步都充满了DIY的乐趣和挑战。
适合谁来玩这个项目呢?首先你得对复古游戏有情怀,其次得有点动手能力和折腾精神,不畏惧命令行和配置文件。它不像买一个成品开源掌机那样即插即用,但完成后的成就感和可玩性,是成品无法比拟的。你可以完全按照自己的喜好定制外观、游戏库,甚至后期自己写脚本优化体验。下面,我就把自己从零搭建GamePi13的全过程,包括踩过的坑、总结的技巧,毫无保留地分享出来。
2. 核心硬件选型与“攒机”哲学
做这种便携设备,硬件是地基。选型的原则就八个字:够用、兼容、易得、散热。盲目堆高配没必要,我们的目标是流畅运行到PS1这一代的游戏。
2.1 计算核心:树莓派3B+的再思考
我选择树莓派3B+,而不是更新的4B或Zero 2 W,是基于多方面权衡:
- 性能足够:对于PS1及以下平台的游戏,3B+的Cortex-A53四核处理器和1GB内存完全够用,甚至运行部分优化好的PSP游戏(如《怪物猎人P3》)也能达到可玩帧率。
- 功耗与发热平衡:3B+的功耗和发热控制比4B好很多。在便携设备狭小的空间里,散热是头等大事。4B性能虽强,但被动散热下满载温度轻松突破80℃,需要额外考虑风扇和风道,增加设计复杂度和噪音。
- 接口与尺寸:3B+拥有标准的40针GPIO、4个USB 2.0、一个全尺寸HDMI,扩展性很好。其尺寸(85x56mm)也比4B略小,在规划内部空间时更灵活。
- 成本与库存:作为上一代主力型号,3B+在二手市场或库存中更容易以实惠的价格买到,降低了项目启动成本。
注意:如果你手头是树莓派4B,当然也可以用,但务必准备好优质的散热片和一个小型静音风扇,并确保外壳有良好的进排气风道。
2.2 屏幕与驱动板:点亮掌机的灵魂
屏幕是交互的核心,选错了体验直接打折。
- 屏幕类型:我选择了一块5英寸IPS液晶屏,分辨率800480。IPS视角广,色彩好,800480对于复古游戏来说点对点显示效果非常棒,且对树莓派3B+的GPU压力小。尺寸上,5寸是便携性和可视面积的黄金平衡点。
- 驱动板:屏幕需要一块驱动板(通常卖家会配套提供)来连接树莓派。这里有个关键点:务必选择支持“直接驱动”且供电与树莓派兼容的驱动板。好的驱动板通过排线连接到树莓派的DSI或GPIO口,能从树莓派取电,无需单独供电,极大简化布线。我踩过的坑是买了一块需要单独接5V电源的驱动板,结果导致设备内部多了一根飞线,非常混乱。后来换成了通过GPIO取电的型号,整洁多了。
- 触摸功能:我没有选择带触摸功能的屏幕。一是复古游戏前端(如EmulationStation)对手柄的支持已经极好,触摸并非必需;二是触摸屏会增加耗电和驱动复杂度;三是成本更高。纯粹的游戏场景下,物理按键的反馈感更佳。
2.3 输入设备:手柄与按键的抉择
输入方案有两种主流选择:使用现成的USB手柄拆解,或使用定制的GPIO按键板。
- 方案一:USB手柄拆解(我采用的方案)。我拆了一个闲置的USB有线手柄,将其主板、按键导电胶和十字键/摇杆模块取出。优点是:
- 成本极低:利用废旧物资。
- 手感有保障:原装手柄的按键手感和布局是经过验证的。
- 驱动简单:系统识别为标准USB游戏手柄,无需额外配置驱动。
- 缺点是布线需要自己焊接,并且手柄主板可能比专门的GPIO按键板大,需要规划空间。
- 方案二:GPIO按键板。市面上有专为树莓派设计的游戏机按键扩展板,直接插在GPIO上,提供标准的街机按键和方向键焊点。优点是集成度高,布线整洁。缺点是额外成本,且按键手感取决于你选用的微动开关或导电胶,需要自己调校。
我选择了方案一。将手柄主板的USB线剪断,直接焊接到树莓派USB口的对应引脚上(+5V, D+, D-, GND),省去了一个USB接口的空间。按键和方向键则通过排线连接到主板。
2.4 供电与电池管理:稳定的能量核心
便携设备,电力是命脉。我强烈建议使用集成充放电管理功能的锂电池升压板。
- 电池:选用一块常见的3.7V、3000mAh左右的手机聚合物锂电池。尺寸需要根据你的外壳空间选择。
- 充放电管理板:这是关键部件。它负责:
- 通过Micro USB或Type-C口为电池充电。
- 将电池的3.7V升压到树莓派和屏幕所需的5V。
- 提供充放电保护(过充、过放、短路)。
- 最好带电量指示灯。
- 连接:将升压板的输出端(5V OUT)连接到树莓派的5V和GND引脚(注意避开数据引脚)。屏幕如果也从树莓派取电,则无需单独连接。这样,整个系统只需一根USB线充电,开机则由一个独立的物理开关控制总电路。
2.5 外壳:从零创造或改造
外壳是让项目从“开发板堆”变成“设备”的关键。你有三个选择:
- 3D打印:如果你有3D打印机或能找到打印服务,这是最自由的方式。可以在Thingiverse等网站搜索“Raspberry Pi Handheld Case”,找到大量开源设计,根据你的屏幕和主板尺寸进行修改。我用Fusion 360自己画了一个,考虑了所有部件的固定柱、散热孔、按键孔位和螺丝柱。
- 利用现成盒子改造:比如防水盒、塑料工具箱。需要较强的动手能力进行开孔和内部固定。优点是成本低,速度快。
- 购买商业外壳套件:有些开源掌机项目会出售配套的CNC雕刻外壳,精度高,颜值好,但成本也最高。
我选择了3D打印。设计时特别注意了以下几点:
- 散热:在树莓派SoC和内存芯片对应的外壳位置,设计了密集的栅格孔。
- 按键布局:参考了经典掌机的布局,确保握持时拇指自然落在方向键和功能键上。
- 内部固定:设计了多个螺丝柱和卡槽,用于固定树莓派、屏幕驱动板、电池和升压板,避免内部部件晃动。
- 屏幕固定:在屏幕四周设计了遮光墙和卡扣,防止漏光,并确保屏幕紧贴前面板。
3. 软件系统搭建:从镜像到前端
硬件组装好比造好了身体,软件系统则是注入灵魂。我们的目标是打造一个开机即玩、无需键盘鼠标的专属游戏系统。
3.1 系统镜像选择与烧录
不推荐使用官方的Raspberry Pi OS(原Raspbian),因为它是一个通用桌面系统,需要大量手动配置才能变成游戏机。我们应该使用专为复古游戏优化的发行版。
- 首选:RetroPie。这是最流行、社区支持最完善的选择。它本质上是一个基于Raspberry Pi OS Lite的软件包集合,集成了EmulationStation前端、RetroArch模拟器核心和各种工具。
- 下载:从RetroPie官网下载对应树莓派3B+的镜像文件(.img.gz)。
- 烧录:使用BalenaEtcher或Raspberry Pi Imager将镜像写入TF卡(建议至少32GB,Class 10以上速度)。
- 备选:Batocera或Lakka。Batocera界面更炫酷,跨平台支持好;Lakka更轻量,界面类似游戏主机系统。但RetroPie的文档和社区问答是最丰富的,对于新手更友好。
我选择了RetroPie。烧录完成后,先不要急着把卡插入树莓派。在电脑上打开TF卡的boot分区,做一件很重要的事:预先配置Wi-Fi和SSH。
- 新建一个名为
ssh的空文件(无后缀),用于开启SSH服务。 - 新建一个名为
wpa_supplicant.conf的文件,内容如下:
这样,首次启动后树莓派就能自动连接Wi-Fi,我们可以通过同一局域网下的电脑用SSH连接进行后续配置,无需接键盘和屏幕。ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=CN network={ ssid="你的Wi-Fi名称" psk="你的Wi-Fi密码" key_mgmt=WPA-PSK }
3.2 首次启动与基础配置
将TF卡插入树莓派,连接电源和屏幕(通过驱动板),开机。首次启动会进行文件系统扩展和初始化,时间稍长。
- 手柄配置:启动后,会自动进入EmulationStation的前端界面,并提示你配置手柄。按照屏幕提示,依次按下你手柄上的各个按键(包括方向、ABXY、选择、开始、肩键等)。这一步至关重要,务必准确。
- 连接网络:如果之前的
wpa_supplicant.conf配置正确,此时应该已经联网。可以在EmulationStation主界面,按“开始键”进入主菜单,选择“Wi-Fi”查看状态。 - 通过SSH深入配置:在电脑上使用SSH客户端(如PuTTY或终端命令
ssh pi@retropie,默认密码:raspberry)连接树莓派。命令行提供了最大的控制权。
3.3 核心环节:模拟器配置与游戏导入
RetroPie的强大在于其模块化。每个游戏平台(称为“system”)都需要对应的模拟器(“emulator”)和“核心”(“core”)。
- 更新与安装模拟器核心:在SSH中,首先更新软件源并安装可能缺失的核心。
sudo apt update sudo apt install lr-pcsx-rearmed lr-mgba lr-snes9x -ylr-开头的包是Libretro核心,被RetroArch调用。例如lr-pcsx-rearmed是PS1模拟器核心,lr-mgba是GBA模拟器核心。 - 游戏文件放置:这是最容易出错的地方。RetroPie有严格的文件目录结构。游戏ROM需要放在
/home/pi/RetroPie/roms/目录下对应的平台文件夹内。- 例如,PS1游戏(.bin/.cue 或 .pbp 格式)放在
/home/pi/RetroPie/roms/psx/ - GBA游戏(.gba)放在
/home/pi/RetroPie/roms/gba/ - SNES游戏(.smc)放在
/home/pi/RetroPie/roms/snes/ - 你可以通过SSH使用
scp命令从电脑上传,或者在Windows下通过\\RETROPIE网络共享访问roms文件夹直接拷贝。
- 例如,PS1游戏(.bin/.cue 或 .pbp 格式)放在
- 刷新游戏列表:放入ROM后,在EmulationStation主界面,按“开始键” -> “游戏列表设置” -> “刷新所有游戏列表”,新游戏就会出现。
3.4 性能调优与美化
默认设置可能不是最优的,我们需要微调。
- 超频(谨慎操作):在SSH中编辑
/boot/config.txt文件,可以小幅提升CPU/GPU性能。
保存重启。注意:超频可能增加发热和不稳定性,建议逐步测试。如果出现死机,移除这些设置即可。# 树莓派3B+ 相对安全的超频设置 over_voltage=4 arm_freq=1350 gpu_freq=500 - 扫描线着色器:为了在液晶屏上还原CRT显示器的质感,可以启用扫描线着色器。在游戏中,按“热键(通常为选择键)+ X”呼出RetroArch快捷菜单,选择“着色器” -> “加载” -> “crt” 目录下的某个扫描线着色器(如
crt-pi.glslp),应用后立即生效。这能极大提升复古游戏的画面韵味。 - 主题更换:EmulationStation默认主题较朴素。可以通过RetroPie-Setup脚本安装更多主题,让界面更炫酷。
在图形化界面中选择“Configuration / tools” -> “esthemes” 来安装和管理主题。sudo ~/RetroPie-Setup/retropie_setup.sh
4. 深度定制与问题排查实录
系统跑起来只是第一步,要让它好用、稳定,还需要一系列深度定制,这也是最容易踩坑的地方。
4.1 按键映射的“玄学”问题
我使用拆解手柄的方案,虽然系统识别为通用手柄,但在某些特定模拟器核心(尤其是非Libretro的独立模拟器)下,可能会出现按键错乱。
- 问题现象:在某一平台游戏里,A键没反应,B键成了A键。
- 排查过程:
- 全局测试:先在EmulationStation的输入配置里确认全局映射是正确的。
- 核心测试:进入RetroArch的输入设置(在游戏中按热键+X进入快捷菜单 -> “设置” -> “输入”),查看“端口1控制”的映射,发现这里也是正确的。
- 定位元凶:问题出在独立模拟器。RetroPie对于某些平台(如N64、PSP)可能会默认使用独立模拟器(如mupen64plus、ppsspp),它们有自己的配置文件,不继承全局或RetroArch的设置。
- 解决方案:以PSP(ppsspp)为例,需要单独配置其按键。
- 通过SSH或网络共享,找到
/opt/retropie/configs/psp/目录。 - 编辑
ppsspp.ini或运行模拟器后,在模拟器自身的设置菜单里重新映射按键并保存。这个配置文件是独立于系统其他部分的。
- 通过SSH或网络共享,找到
- 经验心得:在RetroPie中,输入配置是分层的:EmulationStation全局层 -> RetroArch核心层 -> 独立模拟器层。遇到按键问题,要逐层排查。一个一劳永逸的技巧是,尽量在RetroArch的“快捷菜单” -> “控制”里配置并保存为“游戏覆写”或“核心覆写”,这样配置会绑定到该游戏或该核心。
4.2 电源管理与安全关机
便携设备不能直接拔电源,否则可能损坏TF卡上的文件系统。
- 硬件开关:我在总供电线上串联了一个自锁开关。但开关只能物理断电,无法执行软件关机。
- 软件关机脚本:目标是按下某个组合键(如“选择+开始”)后,系统安全关机,然后通过指示灯或屏幕提示告知用户可以关闭物理开关。
- 编写脚本。创建文件
/home/pi/shutdown.py:
并赋予执行权限:#!/usr/bin/env python3 import os, time # 执行关机命令 os.system("sudo shutdown -h now") # 这里可以添加控制GPIO灯闪烁的代码(如果需要)chmod +x /home/pi/shutdown.py - 映射到按键:这需要利用RetroArch的“热键”功能。编辑
/opt/retropie/configs/all/retroarch.cfg,找到并修改:input_enable_hotkey_btn = "0" # 将“选择键”设为热键,这里的“0”需要根据你的手柄实际键值修改,可能是其他数字 input_exit_emulator_btn = "7" # 将“开始键”设为退出模拟器键 # 添加自定义命令,将热键+开始映射到运行我们的脚本 input_menu_toggle_btn = "nul" input_reset_btn = "nul" # 更优雅的方式:使用systemd或autostart脚本监听GPIO按键,但更复杂。 - 更可靠的方案:实际上,更常见的做法是利用GPIO引脚连接一个轻触开关,并编写Python脚本监听该引脚。当检测到按键被长按时,触发关机命令。这需要一些简单的电路和编程,但比在模拟器内映射更稳定、独立。
- 编写脚本。创建文件
4.3 游戏列表与元数据美化
默认的游戏列表只是一堆文件名,体验不好。我们可以为其添加封面、描述等元数据。
- 手动刮削:在EmulationStation主界面,选中一个游戏平台,按“开始键” -> “刮削器”,可以选择从ScreenScraper或TheGamesDB等网站自动下载游戏封面、截图、描述和评级。这个过程需要网络,且对中文ROM名支持有时不佳。
- 技巧:自动刮削失败时,可以手动操作。将下载好的封面图片(建议命名为
游戏名.png,尺寸最好为640x480)放入/home/pi/RetroPie/roms/平台名/images/目录下。然后编辑该平台对应的gamelist.xml文件(在/home/pi/.emulationstation/gamelists/平台名/下),手动添加<image>标签指向图片路径。虽然繁琐,但对于少量经典游戏是值得的。
4.4 散热与稳定性实战
在封闭外壳内连续运行游戏一小时以上,散热是必须面对的挑战。
- 问题:运行PS1游戏《最终幻想9》半小时后,画面开始卡顿,随后系统重启。
- 排查:通过SSH在运行时监控温度:
vcgencmd measure_temp。发现卡顿时温度已达到82°C。树莓派3B+的CPU在80°C以上会开始自动降频(throttling),导致性能下降,温度过高则直接重启。 - 解决方案:
- 增强被动散热:我最初只贴了一个小型散热片。后来更换为带铜管的复合散热片,增大与空气的接触面积。
- 优化风道:在外壳的CPU正上方和侧后方(对应主板背面)开了更多的蜂窝状通风孔,形成空气对流。
- 软件优化:在
/boot/config.txt中增加一行temp_soft_limit=75,这会在温度达到75°C时更积极地调节CPU频率,避免触及硬降频点。同时,确保超频设置(如果有)不过于激进。 - 结果:采取以上措施后,长时间运行重载游戏,温度稳定在70-75°C之间,未再出现降频卡顿。
5. 项目总结与进阶玩法
经过几周的折腾,这台GamePi13已经成为了我通勤路上的好伙伴。从一堆散件到一台功能完整的掌机,整个过程充满了解决问题的乐趣。回顾下来,有几个点特别值得分享:
首先,规划比动手更重要。在开始焊接和打印外壳之前,最好用纸板或3D建模软件做一个1:1的模型,把所有部件放进去看看空间是否足够,接口位置是否冲突。我就在第一版外壳上吃了亏,屏幕驱动板的位置挡住了两个USB口,导致无法使用。
其次,供电一定要留有余量。树莓派3B+峰值电流可能达到1.5A以上,屏幕驱动板也需要几百毫安。你的升压板持续输出能力最好在2.5A-3A之间。电池容量则决定了续航,3000mAh电池在中等亮度下玩GBA游戏大约能撑4-5小时,玩PS1游戏可能只有3小时左右。如果需要更长续航,可以考虑并联电池,但要注意充放电管理板的负载能力。
关于软件的稳定性,RetroPie系统本身非常稳定,但不同模拟器核心的成熟度不一。对于PS1及以下的平台,lr-pcsx-rearmed、lr-snes9x、lr-mgba这些核心几乎完美。但N64、PSP、Dreamcast等平台的模拟,即使在高性能的树莓派4B上也可能存在兼容性和速度问题,需要针对具体游戏调整模拟器设置(比如切换图形插件、降低分辨率)。在GamePi13(3B+)上,我建议主要专注于PS1及以下的经典平台,体验是最完美的。
最后,这个项目的扩展性很强。完成基础版后,你还可以:
- 增加音频功放和喇叭:使用一块PAM8403之类的小型数字功放板,连接树莓派的音频输出(GPIO或USB声卡),让外放声音更洪亮。
- 集成震动马达:有些模拟器核心支持震动功能,你可以将一个微型震动马达(手机里那种)连接到GPIO,并通过Python脚本控制,在特定游戏场景下提供力反馈。
- 定制开机动画和音效:替换
/home/pi/RetroPie/splashscreens/目录下的视频或图片,打造专属开机体验。 - 网络对战:部分模拟器核心(如RetroArch的Netplay功能)支持局域网甚至互联网联机,可以和朋友一起怀旧。
GamePi13不仅仅是一台游戏机,它是一个载体,承载着对旧时光的怀念,也承载着动手创造的满足感。每当你按下电源键,看到熟悉的游戏列表,那种感觉和打开手机上的模拟器App是完全不同的。它不完美,可能有这样那样的小毛病,但正因为这些亲手调试、打磨的痕迹,让它成为了独一无二的存在。如果你也有类似的零件和想法,不妨动手试试,从最简单的开始,享受这个过程。