目前大多数NES模拟器需要使用某种C编译器(例如esp-idf)手动进行命令行构建,这对于初学者来说是一个很大的障碍。
这周就和大家分享如何使用Arduino IDE做一个便携式NES(红白机)游戏机。
NES游戏机是一款由任天堂公司于1985年发布的家用电子游戏机。NES是“Nintendo Entertainment System”的缩写,也被称为“红白机”。该游戏机在1980年代和1990年代风靡全球,并为游戏业界的发展做出了重要贡献。
NES游戏机使用卡带作为游戏载体,玩家可以通过插入卡带来运行各种游戏。该游戏机的手柄设计也非常经典,包括方向键、A、B两个按钮和选择、开始两个功能键。
许多经典游戏如《超级马里奥兄弟》、《塞尔达传说》、《龙与地下城》、《银河战士》等都是在NES游戏机上首次发布的。即使在今天,许多玩家仍然喜欢玩NES游戏机上的经典游戏,而该游戏机的影响力也一直延续至今。
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
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
为了支持尽可能多的显示变化,我将显示实现更改为使用 Arduino_GFX。现在甚至支持像ST7796这样的大型4英寸320x480显示屏。
以下是Arduino_GFX支持的可以适用于Nofrendo分辨率的显示变化:
注意:
320 x 480显示需要将原始256 x 240分辨率裁剪为240 x 214,然后放大到480 x 320。
宽度放大两倍,高度放大1.5倍,每2个原始线条绘制3条线。第三条线可以重复第二条线,也可以简单地保留第三条线的背景色。
详细实现可在display.cpp中找到。
目前arduino-nofrendo支持(实际上是arduino-esp32支持)2种音频输出方法:
注意:
内置DAC仅具有8位分辨率,并且存在过多的静态噪声(杂音),通过使用外部的 I2S 放大模块可以降低这种静态噪声的影响(因为外部模块可以提供更好的信噪比和动态范围。)
目前arduino-nofrendo支持3种类型的控制器:
即将支持:
注意:
默认的arduino-esp32 I2C接口连接到GPIO 21(SDA)和22(SCL)。
Nofrendo在文件系统中存储3种类型的文件:
目前arduino-nofrendo支持(实际上是arduino-esp32支持)3种类型的文件系统:
注意:
选SPIFFS测试是最简单的方法,但在SPIFFS中备份存档和状态文件比较困难,SD或SD_MMC更适合长期使用。另外,如上面视频演示,你可以将SD卡当作游戏卡,只需更换SD卡即可更换游戏。
如果你尚未安装Arduino IDE,请下载并安装:
https://www.arduino.cc/en/main/software
按照安装说明添加ESP32支持,如果尚未安装:
https://github.com/espressif/arduino-esp32
注意:请使用arduino-esp32版本1.0.6进行此项目,较新版本可能无法成功编译
按照安装步骤安装Arduino ESP32 filesystem uploader,如果没有安装的话:
https://github.com/me-no-dev/arduino-esp32fs-plugin
下载最新的Arduino_GFX库:(点“Clone or Download”->“Download ZIP”)
https://github.com/moononournation/Arduino_GFX
在Arduino IDE中导入库。(Arduino IDE“项目”菜单->“包含库”->“添加.ZIP库”->选择下载的ZIP文件)
下载最新的Arduino Nofrendo库:(点“Clone or Download”->“Download ZIP”)
https://github.com/moononournation/arduino-nofrendo
同样在Arduino IDE中导入库。(Arduino IDE“项目”菜单->“包含库”->“添加.ZIP库”->选择下载的ZIP文件)
在制作你自己的便携式Arduino NES控制台最终版本之前,让我们先用面包板原型进行一个PoC(概念验证)。
4寸LCD是一个比较大的尺寸,我们需要把四个400孔面包板组合在一起。不过,8个电源总线太多了,我们去掉其中的6个,只保留2个就足够了。
将四个400孔面包板组合在一起可以放下4寸LCD,但仍然没有足够的剩余空间来放一块ESP32开发板。因此,我们需要将ESP32开发板的一部分隐藏在LCD下方。同时,将线路也隐藏在LCD下方使其更整洁。
但我发现TTGO T8 V1.7的3D天线无法放LCD下方。由于NES控制台不需要互联网接入,我就直接把它拆了……
注意:
带有引脚的模拟摇杆一侧可以非常好地固定在面包板上,但另一侧需要一些额外的引脚才能固定在面包板上。
I2S放大器模块的扬声器连接器不是2.54毫米间距(面包板孔的间距大小),需要稍微弯曲引脚接头以方便焊接。
在实际的面包板布线之前,我们首先先设计所有组件的布局,并仔细检查所有组件的位置是否与LCD冲突。
这一步是可选的,只是为了使线路更加整洁(由于所有的线路都隐藏在LCD后面,这并不是必要的)。
大多数ESP32接口可以重新映射到任何GPIO引脚,除了SD_MMC。由于TTGO T8 v1.7已经内置了与SD_MMC接口连接的SD卡插槽,我想重用那些引脚连接到LCD SD卡插槽。
我在开发板下方使用了一些面包板线将一些GPIO重定向到其他面包板条,让整个布局看起来更加整洁:
注意:
SPI显示器通常需要连接7个GPIO引脚,它们是CS、RESET、D/C、SCK、MOSI、MISO和LED。为了把GPIO的使用次数减少到3次,进行了一些安排:
以下是连接汇总:
ESP32 VCC -> LCD VCC & LED, I2S放大器模块VCC,摇杆VCC GND -> LCD GND & CS, I2S放大器模块GND,摇杆GND,所有按钮GND RST -> LCD RST GPIO 34 -> 摇杆上下模拟 GPIO 35 -> 摇杆左右模拟 GPIO 32 -> LCD D/C GPIO 33 -> LCD MOSI GPIO 25 -> LCD SCK GPIO 26 -> 按钮开始 GPIO 27 -> 按钮选择 GPIO 23 -> 按钮X GPIO 18 -> 按钮Y GPIO 5 -> 按钮A GPIO 4 -> 按钮B GPIO 14 -> SD SCK GPIO 13 -> SD CS GPIO 15 -> SD MOSI GPIO 2 -> SD MISO GPIO 22 -> I2S放大器模块BCLK GPIO 21 -> I2S放大器模块WCLK(或称LRC) GPIO 19 -> I2S放大器模块DOUT(或称DIN) I2S放大器模块GAIN -> 100欧姆电阻 -> GND(可选15 dB增益) I2S放大器模块+ve -> 扬声器+ve I2S放大器模块-ve -> 扬声器-ve
TTGO T8 v1.7开发板内置了锂电池充电和稳压电路。连接一个锂电池可以让游戏机变得更便携式,但对于原型设计来说并不是必要的。
面包板背后有一个很大的平面,可以放置一个非常大的锂电池。
操作步骤如下:
注意:
有时需要拆卸 SD 卡才能成功上传。
如果你手头没有任何 NES rom 文件,可以在网上找到许多自制的 NES rom,例如:
http://www.nesworld.com/article.php?system=nes&data=neshomebrew
我已经在“最佳自制任天堂娱乐系统游戏[1]”中选择了一个名为“Chase”的简单游戏,用于esp32-nofrendo示例。
注意:
还推荐一个名为 "BLADE BUSTER" 的自制射击游戏,但是 rom 大小不能适用于没有 PSRAM 的开发板。(nofrendo 需要将 rom 文件加载到内存中)
默认的 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 文件并加载它。
状态保存和加载,也称为无限恢复,是一种简单的作弊技巧,可以帮助你更轻松地玩游戏。
NES没有X和Y按钮,我们要把它们用作状态保存和加载的按钮。
注意:
Nofrendo 设计了 10 个状态保存和加载插槽,目前 arduino-nofrendo 只能使用第一个插槽(插槽 0)。
目前市面上很少有预先构建为游戏机的ESP32开发设备,例如:
参考:
https://t-watch-document-en.readthedocs.io/en/latest/introduction/index.html
参考:
https://www.hardkernel.com/shop/odroid-go/
注意:
CardKB 一次只能读取一个按键被按下的信息,适合玩某些特定的游戏。
参考:
https://m5stack.com/collections/m5-core
https://m5stack.com/products/cardkb-mini-keyboard
Arduino IDE 是一个非常易于使用的平台。esp32-nofrendo 示例只是一个起点,你可以在其上添加更多的功能,例如:
赶快动手做一个你自己的 Arduino NES 吧!
[1]最佳自制任天堂娱乐系统游戏: http://www.nesworld.com/article.php?system=nes&data=neshomebrew_bestof
原文作者:陳亮
原文链接:https://www.instructables.com/Arduino-NES/
译文首发于:DF创客社区
ESP-Hosted 解决方案提供了将 ESP 板用作 Wi-Fi 和 Bluetooth/BLE 连接的通信处理器的方法。
ESP-Hosted 提供了一种将ESP芯片和模组用作通信协处理器的解决方案,该解决方案为主机微处理器或微控制器提供无线连接,使主机能够与其他设备通信。简单来说为网卡方案。
Arduino+ESP32上使用TFT_eSPI库快速点亮这个屏幕,驱动芯片ST7789
本文给出了一个ESP32与SPI 接口TFT显示屏接线的详细说明,供大家参考。
本文讲解如何在Micropython环境下使用ESP32的ESPNow功能进行数据传输。
ESP-Dongle 是一款基于 ESP32-S3 芯片开发的多功能 USB Device 解决方案。它不仅外形小巧,功能齐全,更集成了无线 U 盘、SD 卡读取以及 USB 无线网卡等多项功能。
ESP32 系列芯片可以利用 CSI 数据实现动作检测和存在检测。无论是自动调节灯光、风扇,还是节能控制,CSI 技术为智能家居带来了新的可能性。随着 CSI 技术的发展,未来的智能家居将能够更精确地感知和响应我们的行为,实现更高效、更人性化的控制。
ESP32-FreeRTOS项目提供了丰富的示例,帮助开发者快速掌握ESP32的硬件功能和FreeRTOS实时操作系统。
本节我们在迭代二的基础上使用四位数码管和OLED显示屏显示相关交互信息。
本节我们在迭代一的基础上增加采集土壤湿度数据,并根据湿度数据来决定是否自动进行浇水动作。