树莓派+RetroPie打造实体卡带N64模拟器:从GPIO到自动启动全解析
2026/9/24 13:27:35 网站建设 项目流程

把树莓派和 RetroPie 拼出一台 N64 模拟器,这件事本身不算新鲜,网上教程一抓一大把。但如果把这个模拟器从“开机选游戏”改成“插卡就玩”,在 GPIO 排针上接一个卡带读取底座,把游戏放进一张实体卡带里塞进去,机器能自动识别并直接启动对应的 N64 游戏,那感觉完全不一样。我做这个项目的出发点,就是想找回当年往主机里插卡、按下电源键的仪式感,同时把树莓派的 GPIO、I2C、模拟器前端这些技术点都串在一起。这篇文章会从硬件选型、GPIO 接线、RetroPie 核心配置到自动启动脚本,把整个流程完整拆开,适合那种手里有树莓派、喜欢折腾复古游戏、又愿意动手焊几根线的玩家照着做。

很多人会问,直接用 MAME 或 RetroArch 菜单点开游戏不就行了,为什么非要折腾实体卡带?答案很简单:模拟器的目录菜单是给电脑用户准备的,实体插卡则是给曾经在客厅里玩 N64 的人准备的。真要说性能提升,它一点帮助都没有,甚至还会因为硬件识别逻辑引入额外的启动等待;但它会逼着你把一个技术项目拆成系统、硬件、外壳、脚本四层,每一层都有足够的改进空间。我做下来最深的感受是,这个项目真正的价值不在于“花小钱获得一台 N64 兼容机”,而在于你用现代开发板重新造了一个老游戏生态的交互入口,玩家接触到的不是一堆 .z64 文件,而是一张可以拿在手里的卡带。

1. 先把项目拆清楚:一台能插实体卡带的树莓派 N64 模拟器到底长什么样

1.1 它解决的不只是“怎么运行 N64 游戏”

RetroPie 默认的工作流程是:开机进 EmulationStation,用键盘或手柄从菜单里找到 n64 分类,选择 ROM 文件,再等模拟器加载。这套流程对电脑用户非常自然,但对小时候玩过实体主机的人来说总觉得少了一段东西。实体卡带的意义就是把“从文件列表里选游戏”变成“把一张卡带插进槽位里”,系统检测到卡带插入后自动加载游戏,拨出卡带后模拟器停止运行。

整个项目涉及两条技术线。第一条是硬件线:树莓派 GPIO 排针上接一个卡带读取底座,底座内用 I2C 总线接 GPIO 扩展芯片,卡带内部通过拨码开关或存储芯片提供游戏 ID。第二条是软件线:RetroPie 负责模拟器运行,Python 守护脚本负责监听 GPIO 事件、读取游戏 ID、调用模拟器命令自动启动游戏。这中间还穿插着电源保护、信号上拉、去抖处理和 systemd 服务管理,是一个典型的多层联动项目。

如果你从来没有接触过 GPIO,可以把它理解成树莓派对外伸出的一排数字信号线,每条线可以读取外部设备的高低电平,也可以对外输出高电平或低电平。我们用它接一个卡带插入检测开关,再用 I2C 总线读取卡带内部的拨码状态,从而知道你插进来的到底是“马里奥赛车”还是“时之笛”。

1.2 这个实现能做什么,做不了什么

从最终效果来说,这套方案能做到三件事。第一,插一张卡带自动启动对应游戏,拔出卡带自动停止当前游戏并回到模拟器待机状态;第二,卡带可以在外观上做成不同颜色、不同标签,壳子里装一个拨码开关,拨到不同位置就代表不同游戏;第三,整套识别逻辑是通用的,理论上可以扩展到 FC、SFC、MD 等其他 RetroPie 支持的平台,不一定非得锁死在 N64 上。

但它也有一些需要提前说清楚的边界。树莓派运行 N64 模拟器的性能远不如 PC 上成熟的模拟器,很多 N64 名作在树莓派 4 上只能以较低内部分辨率运行,个别游戏会出现贴图错误或音频延迟,这不是脚本或卡带结构能解决的,需要接受模拟器的先天限制。另外,这里说的“实体卡带”只是复刻了插卡这个交互动作,并不是真的把原版 N64 卡带插到树莓派上直接读取 ROM。原版 N64 卡带的读取协议非常复杂,信号电平也不是 3.3V CMOS 逻辑,直接用树莓派 GPIO 去硬怼几乎没有可行性,所以项目里用的是“卡带外壳 + 拨码开关/存储芯片 + 底座识别”的方案,卡带里不放游戏数据,只放一个识别编码,真正的游戏 ROM 依然存放在树莓派的存储卡里。

这个取舍是合理的。我们追求的是插卡的仪式感和自动启动的体验,不是复刻 N64 主机的总线协议。真在意原版卡带兼容,不如直接买一台二手 N64 主机加 CF 烧录卡,那是另一条路。

2. 方案选型:树莓派型号、卡带识别方式和 GPIO 扩展方案

2.1 树莓派选型:为什么最终用了 4B

树莓派 3B+ 也能跑 RetroPie,但 N64 模拟器对性能的要求相当高,3B+ 跑一些 2D 或轻量级 3D 游戏还能勉强接受,跑《塞尔达传说:时之笛》《马里奥赛车64》这种重负载游戏基本就是幻灯片水平。树莓派 4B 的 CPU 性能和视频解码能力比 3B+ 高出一截,是 RetroPie 社区里跑 N64 模拟器的甜点配置。树莓派 5 的性能更强,但 RetroPie 对它的适配成熟度不如树莓派 4,至少在相当长一段时间里,树莓派 4B 的参考资料和踩坑记录最多,照着做最稳。

如果你手里只有树莓派 3B+,也不是不能做,但需要把期望值压低,尽量选择对性能要求低的 N64 游戏,同时在模拟器设置里把内部分辨率降到原始分辨率,关闭一些高开销的后期特效。我的建议是:能做,但别指望流畅。

硬件配置上,我建议选树莓派 4B 2GB 以上内存版本,用一个额定 5V 3A 的电源,SD 卡用 A2 级别的 64GB 或 128GB 产品,安装散热片和小风扇。N64 模拟器负载高的时候 CPU 会明显发热,散热不到位容易出现降频导致的卡顿和画面撕裂,这个问题经常被不懂的人误判成模拟器设置不对。

2.2 卡带识别方案对比:拨码开关、RFID、EEPROM

实体卡带的核心任务就是给树莓派提供一个“游戏 ID”。我在构思阶段比较过三种方案。

第一种方案是 RFID/NFC 标签。每一张卡带里贴一个 NFC 标签,底座里放一个 MFRC522 读卡器,标签内部写入一个号码,系统读到号码后映射到游戏。这种方案的好处是卡带表面没有任何开孔,外观最接近真实卡带,并且标签成本很低;缺点是 MFRC522 模块的读取距离很短,卡带插入深度、外壳厚度都会影响读取稳定性,而且不少廉价模块的 SPI 接口对杜邦线长度非常敏感,线稍微长一点就会出现读不到卡或者读到一半断开的情况。

第二种方案是 I2C EEPROM 芯片。每一张卡带内部焊接一颗 AT24C32 等存储器,底座通过金手指连接器与卡带内部电路接触,树莓派通过 I2C 总线读取芯片里的 ID 字节。这个方案稳定性极佳,没有去抖问题,也支持写很多信息,但每张卡带都要焊芯片、焊连接器,制作成本和工作量都偏高,不是每个人都愿意碰烙铁。

第三种方案是拨码开关直接输出电平。卡带内部装一个 4 位或 8 位拨码开关,开关的公共端接地,每一位拨码接到底座上的一个 GPIO 输入引脚。树莓派读取这些引脚的电平组合,组合值就是游戏 ID。这个方案成本最低、实现最简单、调试最容易,代价是你需要在卡带侧面开一个拨码窗口,外观上会有一点“开发者原型”的味道。

我最终选了第三种,但做了一点升级:不直接用树莓派的一堆 GPIO 引脚去读拨码开关,而是用 MCP23017 这类 I2C GPIO 扩展芯片做中间层。原因是拨码开关需要的地线、信号线数量不少,直接占用树莓派原始 GPIO 会让接线变得又乱又难排查;而 I2C 总线只需要 SDA、SCL 两条信号线,扩展芯片可以放在底座内部,卡带只需要提供一个 ID 电平组合,接线数量大大减少,扩展性也好。

方案成本接线复杂度稳定性外观还原度实现难度
RFID/NFC中低
I2C EEPROM中高中高较高
I2C 扩展器 + 拨码开关中低

最终我的实现采用四位数拨码开关作为卡带内的 ID 设定,底座里用 PCF8574 I2C 扩展器读取这四位状态,插入检测用一颗连接到树莓派 GPIO 的微动开关完成。PCF8574 和 MCP23017 的用法类似,但 PCF8574 接线更少、代码更简单,适合这个项目。

3. 硬件搭建与 GPIO 接线细节

3.1 材料清单和底座设计

我用的材料如下:

  • 树莓派 4B 主板一块,散热片和风扇一套
  • PCF8574 模块一个,带 3.3V 稳压的版本更好
  • 4 位拨码开关若干,对应的卡带外壳用 3D 打印,也可以手工做纸壳
  • 微动开关一个,用作卡带插入检测
  • 2.54mm 排针母座、杜邦线若干
  • 3D 打印的卡带底座外壳,内部预留 PCF8574 模块和开关位置
  • 外部供电的 5V 3A 电源

卡带底座是项目里最关键的物理结构部分。我用建模软件画了一个扁平的“读卡槽”,槽底排了两排弹簧针,用来接触卡带底部的 ID 输出焊盘。如果你没有弹簧针,用一个母座排针倒着焊也可以,但插拔几次后接触会变松,建议还是用弹针。

卡带本体侧面开一个拨码窗口,底部做若干块裸露铜箔或排针焊盘,其中四位连接到拨码开关的四个输出端,另外至少要有两个脚接 GND。插进底座时,GND 先接通,然后四位信号脚通过底座引到 PCF8574 的输入引脚上。

要特别注意的是,PCF8574 模块的工作电压要选 3.3V 版本,不能用 5V 版本直接怼树莓派 GPIO。虽然树莓派 GPIO 对 5V 信号也能容忍一部分,但这个项目里最好从一开始就保持 3.3V 逻辑电平,防止长期使用损伤 GPIO 端口。

3.2 PCF8574 接线和插入检测引脚分配

PCF8574 是一个 I2C 芯片,默认地址是 0x20,树莓派通过 I2C 总线读取它的 P0 到 P7 引脚状态。以下是我用的接线方式:

树莓派 GPIOPCF8574 模块说明
PIN 1(3.3V)VCC模块供电
PIN 6(GND)GND共地
PIN 3(GPIO2 / SDA)SDAI2C 数据线
PIN 5(GPIO3 / SCL)SCLI2C 时钟线

PCF8574 的 P0 到 P3 分别接到底座卡槽里四个 ID 信号脚,插上卡带时,这四个信号脚会接到拨码开关的某一位。拨码开关的公共端接 GND。拨码开关拨到 ON 时,对应信号脚被拉低;拨到 OFF 时,该脚悬空,PCF8574 内部上拉把它保持在高电平。

插入检测开关单独接到树莓派 GPIO17 和 GND 上。系统开机时 GPIO17 被设置为带上拉的输入,没有插卡时读到高电平;插进卡带后,开关被卡带底部压住,GPIO17 被拉低到 GND,产生一个由高到低的下降沿。Python 脚本捕获这个下降沿后,再去读取 PCF8574 的 ID。

这个设计的巧妙之处在于:插入检测用树莓派原始 GPIO,读取卡带 ID 用 I2C 扩展器,两者职能分离,任何一个环节出问题都容易定位。如果某个拨码位没接好,最多是读出来的 ID 不对,不会导致整个 GPIO 端口挂掉。

3.3 接线时的几个硬性注意点

GPIO 和电源接线方面最常出的问题有三个。第一,PCF8574 模块如果带板载 LED 指示,或者板上有稳压器,千万不要直接用 5V 给树莓派 GPIO 引脚供电,一定把模块的 VCC 接到树莓派 3.3V,否则 Python 脚本读回来的电平有可能被抬高,长期使用也会增加树莓派 GPIO 损坏的概率。第二,I2C 总线在杜邦线超过 20 厘米时会出现信号反射,导致读回的数据偶尔变成 0xFF 或者 0x00,解决办法是把 SDA 和 SCL 两根线放到一起,尽量减少长度,不要把它们走到不同方向绕一大圈。第三,GND 必须可靠连通,尤其是卡带底座和树莓派之间的 GND,如果 GND 线接触不良,I2C 芯片会像断电一样彻底失联,这时候大概率不是坏了,而是共地问题。

给卡带做 ID 编号时,我建议四位拨码里约定 0x00 为“空卡带”或“未定义”,从 0x01 开始映射游戏。这样当脚本读到 0x00 时可以什么都不做,避免你拿一张空卡带插进去时模拟器随便启动一个游戏。

4. RetroPie 系统安装与 N64 模拟器核心选择

4.1 刷入镜像和初始化设置

树莓派 4B 上装 RetroPie 可以直接从官网下载现成镜像,用树莓派官方 Imager 写入 SD 卡。第一次开机后会进入配置界面,先设置 Wi-Fi,再把键盘或手柄配置好,随后就能进 EmulationStation 的图形界面。

RetroPie 镜像自带了大量模拟器核心,但 N64 的核心不一定是默认就装好的,需要你到 RetroPie 的配置菜单里确认。进入 RetroPie-Setup 界面,选择“Manage packages”,再选“Manage libretro cores”,在里面找到 lr-mupen64plus 或 lr-parallel-n64,安装一个作为主用核心。

安装完核心后,把 N64 游戏 ROM 拷贝到/home/pi/RetroPie/roms/n64目录。N64 常见的 ROM 格式包括 .n64、.z64、.v64,Endianness 不同,但 RetroPie 基本都能识别。建议先把 ROM 放在这个目录里,在 EmulationStation 里手动确认每个游戏能正常启动,之后再接入卡带自动启动脚本。手动测试这一步不能省,因为如果某个游戏本身就无法模拟,你怎么插卡它都不会流畅。

4.2 N64 模拟性能的关键设置

树莓派 4B 跑 N64 并不是开箱即流畅,需要改几个关键参数。进入某个游戏后,在 RetroArch 的快捷菜单里可以调整内部分辨率。N64 原始分辨率是 320x240,树莓派 4 在大多数游戏里可以把内部分辨率提高到 2 倍左右,也就是 640x480,画面会有明显改善;如果发现帧数不稳,降到原始分辨率是最稳的兜底方案。

视频插件方面,lr-mupen64plus 核心有多个 graphics plugin 可选,常见的是 glide64 和 angrylion。glide64 速度快、画面有柔和感,对树莓派更友好;angrylion 画面更精确,但开销非常大,树莓派上基本跑不动。在配置文件中直接指定为主视频插件能减少大量兼容性问题。

音频方面,如果出现爆音或音频滞后,优先把采样率从 48000Hz 改到 44100Hz,并在音频驱动选项里开启“音频同步”。做过模拟器调试的人都知道,音频问题很多时候不是配置问题而是驱动缓冲卡顿,降低采样率反而比增加缓存更有效。

顺手说一下散热。N64 模拟器吃 CPU 时树莓派发热明显,我建议你别把树莓派塞在一个密闭的卡带底座外壳里,底座要留出通风口,或者干脆把树莓派放在底座旁边,只让卡带读取槽独立存在。密闭壳会导致温度过高,CPU 降频后模拟帧数会突然掉一半,你会以为是自己配置错了,其实是过热。

5. 核心动作:用 Python 脚本把插卡动作变成自动启动游戏

5.1 整体运行逻辑

树莓派上电后,一个 systemd 服务会拉起一个 Python 守护脚本。这个脚本里有一个循环,监听 GPIO17 的边沿变化,同时通过 I2C 周期性地检查 PCF8574 的状态。卡带插入的瞬间,GPIO17 被拉低,脚本进入“卡带已插入”状态,开始从 PCF8574 读取四位 ID。读到一个有效 ID 后,脚本根据映射表查找对应的 ROM 文件路径,然后调用 runcommand 命令启动模拟器。

运行过程中,脚本会继续监听 GPIO17,一旦检测到卡带被拔出,就执行停止模拟器的命令,然后回到待机状态,等待下一张卡带插入。为了防止插拔时开关抖动导致误判,必须做去抖处理。

这套流程用文字描述很简单,但真正写代码时有几个细节决定成败。第一,PCF8574 的读取要连续执行两遍,间隔 50ms,两次结果一致才算有效。第二,启动模拟器前要先检查当前是否已经有模拟器在运行,有的话先退出,避免两个模拟器进程打架。第三,runcommand 经常需要一个图形环境变量,脚本需要用 sudo 或 su 切到运行 RetroPie 的用户,并设置 DISPLAY 环境变量。

5.2 读取卡带 ID 的 Python 代码

PCF8574 的 I2C 读取可以用 smbus2 库完成。安装方式很简单:

sudo pip3 install smbus2

读取 PCF8574 的 P0-P3 引脚状态,代码大概是这样:

import smbus2 import time I2C_BUS = 1 PCF8574_ADDR = 0x20 bus = smbus2.SMBus(I2C_BUS) def read_cart_id(): raw = bus.read_byte(PCF8574_ADDR) # P0-P3 对应低 4 位,取反后获得拨码开关的 ON/OFF 状态 # 如果没有插卡,PCF8574 所有输入都处于悬空上拉状态,读到 0x0F return (~raw) & 0x0F def wait_for_cart_stable(): best = None for _ in range(5): val = read_cart_id() if val != 0x0F: if best is not None and val == best: return val best = val time.sleep(0.05) return None

PCF8574 的引脚默认是弱上拉输入,读取时每一位都是 1;拨码开关把某一位拨到 ON 并接地后,那一位变成 0,所以read_cart_id()里做了按位取反,方便映射到 1 到 15 的 ID。

5.3 映射表与自动启动命令

ID 映射表的实现我建议用 JSON 文件,放在/opt/cart-slot/cart_config.json里。格式可以是这样:

{ "1": { "name": "Mario Kart 64", "rom": "/home/pi/RetroPie/roms/n64/mariokart64.z64" }, "2": { "name": "The Legend of Zelda Ocarina of Time", "rom": "/home/pi/RetroPie/roms/n64/oot.z64" }, "3": { "name": "Super Mario 64", "rom": "/home/pi/RetroPie/roms/n64/sm64.z64" } }

读到 ID 后,脚本读取 JSON,找到对应 rom 路径,然后调用 runcommand:

DISPLAY=:0 sudo -u pi /opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ n64 "/home/pi/RetroPie/roms/n64/oot.z64"

第一次调试时,建议你先在树莓派的 SSH 终端手动执行这条命令,确认它能拉起模拟器。如果报错,最常见的两个原因是:第一,ROM 路径里的文件名大小写不对,Linux 是区分大小写的,N64 目录里是OOT.z64还是oot.z64必须严格一致;第二,runcommand 运行时需要一个可用的视频接口,SSH 会话里没有DISPLAY,所以要带上DISPLAY=:0,如果你用的是树莓派桌面窗口模式,可能还需要导出XAUTHORITY,这取决于你的系统版本。

Python 里用 subprocess 调用,注意不要在父进程里等模拟器退出,否则卡带拔出检测会卡死。正确做法是用Popen启动:

import subprocess import os def launch_game(rom_path): cmd = [ "/opt/retropie/supplementary/runcommand/runcommand.sh", "0", "_SYS_", "n64", rom_path ] env = os.environ.copy() env["DISPLAY"] = ":0" subprocess.Popen(cmd, env=env, cwd="/home/pi")

停止当前模拟器的逻辑稍作处理:先尝试用pkill retroarch,但如果当前没有 retroarch 在跑,pkill 会返回错误码,脚本里要忽略它。如果你用的是其它核心,也可以按进程名匹配,但 RetroPie 下 retroarch 几乎是唯一前端,够用了。

5.4 作为 systemd 守护服务运行

为了让脚本开机自启,写一个 systemd service 文件。先把 Python 脚本放到/opt/cart-slot/cart_daemon.py,然后新建/etc/systemd/system/cart-slot.service

[Unit] Description=Cartridge Slot Daemon After=multi-user.target [Service] ExecStart=/usr/bin/python3 /opt/cart-slot/cart_daemon.py Restart=on-failure User=pi [Install] WantedBy=multi-user.target

然后执行:

sudo systemctl daemon-reload sudo systemctl enable cart-slot.service sudo systemctl start cart-slot.service

注意脚本里如果要调用 runcommand,必须以 pi 用户身份运行,否则启动模拟器时会因为权限或 home 目录不对而失败。上面 service 文件里已经用User=pi指定了用户,如果不行,再配合sudo -u pi调用命令。日志可以通过journalctl -u cart-slot.service -f查看,这一步在排查问题时非常有用。

我踩过一个比较深的坑:脚本以 root 身份启动后,runcommand 虽然能运行,但模拟器读不到/home/pi/.config/retroarch/retroarch.cfg里的手柄配置,导致插卡启动游戏后手柄完全没反应。改成以 pi 用户运行后问题立即消失。所以service 里指定用户千万别省略。

6. 常见问题与实操避坑记录

6.1 插卡后识别不到 ID 或 ID 不稳定

这个问题的原因多半是接触不良或上拉不够。先检查卡带底部的铜箔/排针焊盘和底座的弹簧针是否对齐,插上卡带后有没有能晃动的情况。再用万用表测 PCF8574 的 P0-P3 引脚电压,确认拨码开关在 OFF 时引脚确实是高电平。如果你用手头的万用表或示波器不方便,可以在脚本里打印read_cart_id()的原始返回值,观察波形变化:拨动开关时,读取值应当稳定变化,如果出现跳动值,就是接触问题。

如果确认接触良好但仍然不稳定,可能出在 I2C 上拉电阻上。树莓派板载 I2C 上拉比较弱,杜邦线略长就会影响边沿,解决办法是在 SDA 和 SCL 上对 3.3V 各接一个 4.7kΩ 上拉电阻。很多 PCF8574 模块板载了上拉电阻,如果模块设计得比较简陋,你可以自己补。

6.2 树莓派发热降频导致游戏卡顿

N64 模拟器会让树莓派 4B 的 ARM 核心长时间跑在高频率上,没有散热片的话几分钟内就会触发温度保护,降频之后帧率直接掉到 20 fps。强烈建议装上铝散热片和主动风扇,底座外壳开好通风孔。还有一种容易被忽略的情况:树莓派使用不带主动散热的金属外壳时,外壳本身会积热,风扇转再快也散不出去,这种情况要改外壳结构,或者在底座的侧面加装 5V 风扇直接对着树莓派吹。

6.3 拔出卡带后游戏不退出或模拟器残留进程

如果拔出卡带后没有反应,先确认 GPIO17 的插入检测信号是否真的变化了。有些微动开关在压缩后不会立刻弹回,或者卡带拔出一半时开关状态还没变,这会让你误以为系统没响应。把脚本里的检测循环改成在每次读取到高电平时连续确认 5 次,再做退出动作,这样能避免很多误判。

如果发现退出动作确实触发了但模拟器还在跑,大概率是pkill retroarch的进程名不匹配。建议先手动执行ps aux | grep retroarch看实际进程名,再把这个名字写进停止命令里。部分核心用的是mupen64plus而不是 retroarch,这时要 pkill 的是 mupen64plus 的进程。

6.4 读取映射表时中文文件名和空格带来的坑

N64 游戏 ROM 的文件名经常带有空格、中文或特殊符号,JSON 解析时如果路径写得不规范,脚本会直接报错。我的习惯是统一用英文短横线或下划线重新命名 ROM 文件,比如the-legend-of-zelda-oot.z64,然后在 JSON 里写实际路径。这样能避免引号转义、空格分割等各种乱七八糟的问题。卡带 ID 可以打印在卡带背面的标签上,做一个简单的对照表贴在底座侧面,使用的时候一目了然。

6.5 我的最终调试心得

整套系统调通后,我重新审视这条项目线,发现最有价值的部分其实不是 N64 模拟本身,而是把“物理世界输入”和“软件世界动作”打通的那一层。拨码开关接上 PCF8574,PCF8574 通过 I2C 和树莓派对话,Python 脚本把电平组合翻译成一个调用命令,命令最终唤醒一个几十年前的游戏——每个环节单独看都很简单,但把它们串起来就需要点全局思维。

如果以后想继续扩展,我建议你往两个方向走。一是给卡带加一张打印好的封面,在卡带外壳内部放一枚 LED 或蜂鸣器,插入时点亮,增加氛围。二是把识别方案从拨码开关换成 I2C EEPROM,每一张卡带写入游戏名称和元数据,这样底座不仅能启动游戏,还能在屏幕上显示卡带信息,甚至可以记录每张卡带的游玩时长。对于动手能力强的玩家,整个项目还可以加一个 OLED 屏幕,直接把当前卡带对应的游戏名显示在底座上。这个系统做出来不是一天两天的事,但每一步改动都会让“插卡玩游戏”这个行为更接近真实主机的质感,也是玩树莓派最解压的方式。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询