超详细教程!自制一个Arduino NES(红白机)游戏机!

2023-03-231.8万
精华项目
AI 快速预览详细 收起
本教程介绍了如何使用Arduino IDE和ESP32开发板制作一个便携式NES(红白机)游戏机。主要硬件包括4.0英寸ST7796S SPI LCD模块、MAX98357 I2S放大器模块等。通过详细的步骤,初学者可以轻松上手。教程涵盖了从材料清单到软件准备、面包板原型设计、引脚映射设计、程序上传等多个方面。此外,还提供了状态保存和加载功能,以及预制的ESP32控制台方案。


超详细教程!自制一个Arduino NES(红白机)游戏机!图1

目前大多数NES模拟器需要使用某种C编译器(例如esp-idf)手动进行命令行构建,这对于初学者来说是一个很大的障碍。

这周就和大家分享如何使用Arduino IDE做一个便携式NES(红白机)游戏机。


NES游戏机是一款由任天堂公司于1985年发布的家用电子游戏机。NES是“Nintendo Entertainment System”的缩写,也被称为“红白机”。该游戏机在1980年代和1990年代风靡全球,并为游戏业界的发展做出了重要贡献。

NES游戏机使用卡带作为游戏载体,玩家可以通过插入卡带来运行各种游戏。该游戏机的手柄设计也非常经典,包括方向键、A、B两个按钮和选择、开始两个功能键。

许多经典游戏如《超级马里奥兄弟》、《塞尔达传说》、《龙与地下城》、《银河战士》等都是在NES游戏机上首次发布的。即使在今天,许多玩家仍然喜欢玩NES游戏机上的经典游戏,而该游戏机的影响力也一直延续至今。


材料清单

  • 4.0 英寸 ST7796S SPI LCD 模块
  • 四个 400 孔面包板
  • TTGO T8 v1.7 ESP32 开发板
  • MAX98357 I2S 放大器模块
  • PCB安装迷你喇叭
  • PSP模拟摇杆模块
  • 六个按钮模块


步骤1:Nofrendo是什么?

Nofrendo是一个很好的NES模拟器,它可以在较老的奔腾系统上全速运行,具有不错的声音支持和良好的兼容性。

Nofrendo是由Matthew Conte在上个世纪开发的,它可以在Windows、Unix和BeOS上运行。由于实现已经泛化以支持不同的平台,许多开发人员开始基于它开发其他平台的NES模拟器。

参考资料:

http://www.baisoku.org

https://www.zophar.net/nes/nofrendo.html

https://github.com/adafruit/nofrendo_arcada

https://github.com/espressif/esp32-nesemu

步骤2:Arduino-nofrendo
Github用户rickyzhang82在2018年将Nofrendo原始源代码推送到Github。我已经fork了该仓库,并将其转换为兼容Arduino库的布局。只需实现osd.h中声明的所有函数即可使其工作。

理论上,如果有足够的RAM和处理能力,这个库可以在任何Arduino平台上使用。由于Espressif已经证明ESP32可以运行Nofrendo,所以我基于他们的示例代码,在examples文件夹下开发了一个esp32-nofrendo示例。

参考资料:

https://github.com/rickyzhang82/nofrendo

https://github.com/moononournation/arduino-nofrendo

步骤3:显示选项
为了支持尽可能多的显示变化,我将显示实现更改为使用Arduino_GFX。现在甚至支持像ST7796这样的大型4英寸320x480显示屏。

以下是Arduino_GFX支持的可以适用于Nofrendo分辨率的显示变化:
  • HX8347C 240 x 320
  • HX8347D 240 x 320
  • HX8352C 240 x 400 (16:9)
  • HX8357B 320 x 480
  • ILI9341 240 x 320
  • ILI9481 320 x 480 18位色彩
  • ILI9486 320 x 480 18位色彩
  • ILI9488 320 x480 18位色彩
  • M5Stack 240 x 320
  • R61529 320 x 480
  • ST7789 240 x 320
  • ST7789 240 x 240
  • ST7796 320 x 480

注意:

320 x 480显示需要将原始256 x 240分辨率裁剪为240 x 214,然后放大到480 x 320。

宽度放大两倍,高度放大1.5倍,每2个原始线条绘制3条线。第三条线可以重复第二条线,也可以简单地保留第三条线的背景色。

详细实现可在display.cpp中找到。

步骤4:音频选项
目前arduino-nofrendo支持(实际上是arduino-esp32支持)2种音频输出方法:
  • 内置DAC - ESP32具有两个8位DAC(数字模拟转换器)通道,分别连接到GPIO25(通道1)和GPIO26(通道2),由于输出非常弱,因此仍需要额外的音频放大器用于扬声器输出。
  • 外部I2S DAC模块 - 只需连接3个信号线和电源到I2S放大器模块,它可以在同一个模块中完成DAC和音频放大器的工作。

注意:

内置DAC仅具有8位分辨率,并且存在过多的静态噪声(杂音),通过使用外部的 I2S 放大模块可以降低这种静态噪声的影响(因为外部模块可以提供更好的信噪比和动态范围。)

步骤5:控制器选项

目前arduino-nofrendo支持3种类型的控制器:

即将支持:
  • 更多I2C设备,例如I2C游戏手柄
  • 蓝牙设备,例如蓝牙游戏手柄和蓝牙键盘

注意:

默认的arduino-esp32 I2C接口连接到GPIO 21(SDA)和22(SCL)。

步骤6:文件系统选项
Nofrendo在文件系统中存储3种类型的文件:
  • ROM文件*.nes - 游戏
  • 游戏存档文件*.sav - 当你在游戏中保存时,数据备份到此文件
  • 状态文件*.ss[0-9] - 当你使用Nofrendo保存状态功能时,数据存储在这些文件中

目前arduino-nofrendo支持(实际上是arduino-esp32支持)3种类型的文件系统:
  • SPIFFS - 通常是ESP32闪存的最后一个分区
  • SD - Arduino标准SPI模式SD卡接口
  • SD_MMC - 原生1位或4位SD模式SD卡接口

注意:

选SPIFFS测试是最简单的方法,但在SPIFFS中备份存档和状态文件比较困难,SD或SD_MMC更适合长期使用。另外,如上面视频演示,你可以将SD卡当作游戏卡,只需更换SD卡即可更换游戏。

步骤7:软件准备Arduino IDE
如果你尚未安装Arduino IDE,请下载并安装:

https://www.arduino.cc/en/main/software
ESP32支持
按照安装说明添加ESP32支持,如果尚未安装:

https://github.com/espressif/arduino-esp32

注意:请使用arduino-esp32版本1.0.6进行此项目,较新版本可能无法成功编译
Arduino ESP32 filesystem uploader
按照安装步骤安装Arduino ESP32 filesystem uploader,如果没有安装的话:

https://github.com/me-no-dev/arduino-esp32fs-plugin
Arduino_GFX库
下载最新的Arduino_GFX库:(点“Clone or Download”->“Download ZIP”)

https://github.com/moononournation/Arduino_GFX

在Arduino IDE中导入库。(Arduino IDE“项目”菜单->“包含库”->“添加.ZIP库”->选择下载的ZIP文件)
Arduino Nofrendo库
下载最新的Arduino Nofrendo库:(点“Clone or Download”->“Download ZIP”)

https://github.com/moononournation/arduino-nofrendo

同样在Arduino IDE中导入库。(Arduino IDE“项目”菜单->“包含库”->“添加.ZIP库”->选择下载的ZIP文件)

步骤8:面包板原型
超详细教程!自制一个Arduino NES(红白机)游戏机!图2

在制作你自己的便携式Arduino NES控制台最终版本之前,让我们先用面包板原型进行一个PoC(概念验证)。

步骤9:面包板改造
超详细教程!自制一个Arduino NES(红白机)游戏机!图3

超详细教程!自制一个Arduino NES(红白机)游戏机!图4

超详细教程!自制一个Arduino NES(红白机)游戏机!图5

4寸LCD是一个比较大的尺寸,我们需要把四个400孔面包板组合在一起。不过,8个电源总线太多了,我们去掉其中的6个,只保留2个就足够了。

步骤10:TTGO T8 V1.7改造
超详细教程!自制一个Arduino NES(红白机)游戏机!图6

超详细教程!自制一个Arduino NES(红白机)游戏机!图7

将四个400孔面包板组合在一起可以放下4寸LCD,但仍然没有足够的剩余空间来放一块ESP32开发板。因此,我们需要将ESP32开发板的一部分隐藏在LCD下方。同时,将线路也隐藏在LCD下方使其更整洁。

但我发现TTGO T8 V1.7的3D天线无法放LCD下方。由于NES控制台不需要互联网接入,我就直接把它拆了……

注意:
  • 以后仍然可以通过IPEX连接器将WiFi信号引导到外部天线
  • 蓝牙设备连接也需要天线

步骤11:LCD改造

超详细教程!自制一个Arduino NES(红白机)游戏机!图8

超详细教程!自制一个Arduino NES(红白机)游戏机!图9

超详细教程!自制一个Arduino NES(红白机)游戏机!图10

超详细教程!自制一个Arduino NES(红白机)游戏机!图11
  • 焊接SD引脚接头
  • 可选操作:重新焊接所有LCD引脚,使引脚稍微伸长到面包板
  • 插入额外的塑料隔离片,在面包板和LCD之间预留更多空间

步骤12:固定模拟摇杆

超详细教程!自制一个Arduino NES(红白机)游戏机!图12

带有引脚的模拟摇杆一侧可以非常好地固定在面包板上,但另一侧需要一些额外的引脚才能固定在面包板上。

超详细教程!自制一个Arduino NES(红白机)游戏机!图13

步骤13:I2S放大器模块改造
超详细教程!自制一个Arduino NES(红白机)游戏机!图14

超详细教程!自制一个Arduino NES(红白机)游戏机!图15

I2S放大器模块的扬声器连接器不是2.54毫米间距(面包板孔的间距大小),需要稍微弯曲引脚接头以方便焊接。

步骤14:布局设计
超详细教程!自制一个Arduino NES(红白机)游戏机!图16

超详细教程!自制一个Arduino NES(红白机)游戏机!图17

在实际的面包板布线之前,我们首先先设计所有组件的布局,并仔细检查所有组件的位置是否与LCD冲突。

步骤15:引脚映射设计
超详细教程!自制一个Arduino NES(红白机)游戏机!图18

这一步是可选的,只是为了使线路更加整洁(由于所有的线路都隐藏在LCD后面,这并不是必要的)。

大多数ESP32接口可以重新映射到任何GPIO引脚,除了SD_MMC。由于TTGO T8 v1.7已经内置了与SD_MMC接口连接的SD卡插槽,我想重用那些引脚连接到LCD SD卡插槽。

我在开发板下方使用了一些面包板线将一些GPIO重定向到其他面包板条,让整个布局看起来更加整洁:

  • 模拟摇杆引脚GPIO 34和35至左下角

  • SD_MMC引脚GPIO 13、15、2和14至右上角

  • 开始和选择按钮引脚GPIO 26和27至右下角

  • 3v3连接至2个电源条

  • GND连接至电源条

  • 模拟摇杆引脚 GPIO 34 和 35 连接到左下方

  • SD_MMC 引脚 GPIO 13、15、2 和 14 连接到右上角

  • 开始和选择按钮引脚 GPIO 26 和 27 连接到右下角

  • 3v3 连接到两个电源插头

  • GND 连接到电源插头

注意:

SPI显示器通常需要连接7个GPIO引脚,它们是CS、RESET、D/C、SCK、MOSI、MISO和LED。为了把GPIO的使用次数减少到3次,进行了一些安排:
  • CS接地,表示始终使能
  • 复位连接到ESP32复位,LCD在ESP32复位时复位
  • MISO不连接,无需从LCD读取数据
  • LED连接至VCC,LCD背光始终100%开启

步骤16:面包板布线

超详细教程!自制一个Arduino NES(红白机)游戏机!图19

超详细教程!自制一个Arduino NES(红白机)游戏机!图20

以下是连接汇总:
  1. ESP32
  2. VCC -> LCD VCC & LED, I2S放大器模块VCC,摇杆VCC
  3. GND -> LCD GND & CS, I2S放大器模块GND,摇杆GND,所有按钮GND
  4. RST -> LCD RST
  5. GPIO 34 -> 摇杆上下模拟
  6. GPIO 35 -> 摇杆左右模拟
  7. GPIO 32 -> LCD D/C
  8. GPIO 33 -> LCD MOSI
  9. GPIO 25 -> LCD SCK
  10. GPIO 26 -> 按钮开始
  11. GPIO 27 -> 按钮选择
  12. GPIO 23 -> 按钮X
  13. GPIO 18 -> 按钮Y
  14. GPIO 5 -> 按钮A
  15. GPIO 4 -> 按钮B
  16. GPIO 14 -> SD SCK
  17. GPIO 13 -> SD CS
  18. GPIO 15 -> SD MOSI
  19. GPIO 2 -> SD MISO
  20. GPIO 22 -> I2S放大器模块BCLK
  21. GPIO 21 -> I2S放大器模块WCLK(或称LRC)
  22. GPIO 19 -> I2S放大器模块DOUT(或称DIN)
  23. I2S放大器模块GAIN -> 100欧姆电阻 -> GND(可选15 dB增益)
  24. I2S放大器模块+ve -> 扬声器+ve
  25. I2S放大器模块-ve -> 扬声器-ve
复制代码

步骤17:可选电池
超详细教程!自制一个Arduino NES(红白机)游戏机!图21

TTGO T8 v1.7开发板内置了锂电池充电和稳压电路。连接一个锂电池可以让游戏机变得更便携式,但对于原型设计来说并不是必要的。

面包板背后有一个很大的平面,可以放置一个非常大的锂电池。

步骤18:程序
超详细教程!自制一个Arduino NES(红白机)游戏机!图22

超详细教程!自制一个Arduino NES(红白机)游戏机!图23

操作步骤如下:
  • 连接设备的 USB 线
  • 打开 Arduino IDE
  • 打开 esp32-nofrendo 示例代码("文件" -> "示例" -> "arduino--nofrendo" -> "esp32-nofrendo")
  • 检查 hw_config.h 和 display.cpp 中的配置参数,默认参数已设置为此面包板的
  • 按下 Arduino IDE 的 "上传" 按钮

注意:

有时需要拆卸 SD 卡才能成功上传。

步骤19:ROM




如果你手头没有任何 NES rom 文件,可以在网上找到许多自制的 NES rom,例如:

http://www.nesworld.com/article.php?system=nes&data=neshomebrew

我已经在“最佳自制任天堂娱乐系统游戏[1]”中选择了一个名为“Chase”的简单游戏,用于esp32-nofrendo示例。

注意:

还推荐一个名为 "BLADE BUSTER" 的自制射击游戏,但是 rom 大小不能适用于没有 PSRAM 的开发板。(nofrendo 需要将 rom 文件加载到内存中)

步骤20:上传 ROM 文件
超详细教程!自制一个Arduino NES(红白机)游戏机!图24

默认的 hw_config.h 参数设置为使用 SD 文件系统,只需将 ROM 文件*.nes复制到 SD 卡中并插入即可使其正常工作。

如果更改为使用 SPIFFS 文件系统,则 esp32-nofrendo 示例已经在 data 文件夹中包含了一个 "Chase.nes" ROM 文件。

只需在 Arduino IDE 中选择 "工具" 菜单 -> "ESP32 Sketch Data Upload" 将 ROM 文件上传到 ESP32 SPIFFS。

你也可以将 ROM 文件复制到数据文件并上传。

注意:

此时,esp32-nofrendo 示例将找到第一个 *.nes 文件并加载它。

步骤21:状态保存和加载




状态保存和加载,也称为无限恢复,是一种简单的作弊技巧,可以帮助你更轻松地玩游戏。

NES没有X和Y按钮,我们要把它们用作状态保存和加载的按钮。

注意:

Nofrendo 设计了 10 个状态保存和加载插槽,目前 arduino-nofrendo 只能使用第一个插槽(插槽 0)。

步骤22:预制的 ESP32 控制台
目前市面上很少有预先构建为游戏机的ESP32开发设备,例如:
  • TTGO T-Watch + Game 模块
  • ODROID-GO
  • M5Stack + M5Stack CardKB

步骤23:TTGO T-Watch + Game 模块




超详细教程!自制一个Arduino NES(红白机)游戏机!图25
  • 打开 esp32-nofrendo 示例代码("文件" -> "示例" -> "arduino-nofrendo" -> "esp32-nofrendo")
  • 选择 "TTGO T-Watch"("工具" -> "板子" -> "TTGO T-Watch")按下上传按钮
  • 上传数据("工具" -> "ESP32 Sketch Data Upload")

参考:

https://t-watch-document-en.readthedocs.io/en/latest/introduction/index.html

步骤24:ODROID-GO
超详细教程!自制一个Arduino NES(红白机)游戏机!图26
  • 打开 esp32-nofrendo 示例代码("文件" -> "示例" -> "arduino-nofrendo" -> "esp32-nofrendo")
  • 选择 "ODROID ESP32"("工具" -> "板子" -> "ODROID ESP32")
  • 按下上传按钮

参考:

https://www.hardkernel.com/shop/odroid-go/


步骤25:M5Stack + M5Stack CardKB



超详细教程!自制一个Arduino NES(红白机)游戏机!图27

  • 打开 esp32-nofrendo 示例代码("文件" -> "示例" -> "arduino-nofrendo" -> "esp32-nofrendo")

  • 选择 "M5Stack-Core-ESP32"("工具" -> "板子" -> "M5Stack-Core-ESP32")

  • 按下上传按钮

注意:

CardKB 一次只能读取一个按键被按下的信息,适合玩某些特定的游戏。

参考:

https://m5stack.com/collections/m5-core

https://m5stack.com/products/cardkb-mini-keyboard

步骤26:开始享受游戏
超详细教程!自制一个Arduino NES(红白机)游戏机!图28

Arduino IDE 是一个非常易于使用的平台。esp32-nofrendo 示例只是一个起点,你可以在其上添加更多的功能,例如:
  • 触摸屏 UI
  • 像 RetroPie 一样的带艺术图像的游戏选择 UI
  • 玩游戏时进行存档
  • 状态插槽选择
  • 带存档的状态保存
  • 状态浏览和加载 UI,带有存档预览
  • 音量设置
  • LCD 背光设置

赶快动手做一个你自己的 Arduino NES 吧!

参考资料
[1]最佳自制任天堂娱乐系统游戏: http://www.nesworld.com/article.php?system=nes&data=neshomebrew_bestof

原文作者:陳亮

原文链接:https://www.instructables.com/Arduino-NES/

译文首发于:DF创客社区

转载请注明来源信息

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(11)
爱好者Ard
爱好者Ard
膜拜,膜拜, 大神
派大星ym
派大星ym
66666666666
派大星ym
派大星ym
酷酷酷酷酷
耘想
耘想
666666666666666
腿毛利小五郎
腿毛利小五郎
厉害厉害
耘想
耘想

花生编程
花生编程
不错不错
花生编程
花生编程
厉害厉害
三春牛-创客
三春牛-创客
学习了!感谢分享
三春牛-创客
三春牛-创客
厉害厉害
独钓寒江雪
独钓寒江雪
esp32+4.0英寸LCD液晶屏+NES,简直无敌
- 没有更多了 -