发作品签到
标准版

基于esp32的arduino软件编程的nes模拟器游戏机

工程标签

2.1w
0
0
67

简介

基于esp32的开源NES游戏掌机,使用arduino软件编程,方便移植和DIY,游戏文件支持大文件(使用psram技术),游戏文件存放于存储卡中,游戏数量可以999+,充分享受游戏乐趣。

简介:基于esp32的开源NES游戏掌机,使用arduino软件编程,方便移植和DIY,游戏文件支持大文件(使用psram技术),游戏文件存放于存储卡中,游戏数量可以999+,充分享受游戏乐趣。

开源协议

Public Domain

创建时间:2021-12-29 19:49:31更新时间:2022-07-02 16:34:23

描述

基于esp32的开源NES游戏掌机,使用arduino软件编程,方便移植和DIY,游戏文件支持大文件(使用psram技术),游戏文件存放于存储卡中,游戏数量可以999+,充分享受游戏乐趣。

 

目前看立创开源社区有两种esp32的游戏机,一个只能放到esp32的rom空间,游戏数量有限,另外一个就是espplay了,espplay很强大,但是音频电路很复杂而且让成本飙升,另外这2种游戏机都用IDF编写的,一般只能刷bin文件,想要移植很难,毕竟IDF安装到编译都挺复杂的,更别说去修改源码了。于是就在网上搜,搜到了这个项目,基于arduino编程的,原始项目只能运行第一个游戏,无法选择,我稍微修改了一下,支持选择游戏文件了。

 

原始项目地址:

https://www.instructables.com/Arduino-NES/

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

 

其实在appcardv3已经完成了,但是那个按键实在有些小,手感也不怎么好,就有了这个新的版本,包含一个基板和面板。

 

一,硬件部分

1,pcb及焊接

pcb打板,基板无厚度要求,面板最好使用铝基板,另外尽量薄一些,0.8-1mm最合适。

焊接时,蜂鸣器引脚多的需要剪掉,其他无要求

2,组装

使用M3螺丝,M3双通铜柱,M3垫片
M3螺丝,8mm以上长度
M3双通铜柱根据你的电池厚度
M3垫片,厚度0.5mm,用于垫前面板和基板,背板及铜柱

视频中是因为垫片还没到货就没展示。

 

二,软件部分

可以直接烧写固件,也可以自行编译

1,直接烧写固件

(1)打开flash_download_tool后开发板选择esp32

(2)然后点击3选择正确的bin文件位置(不要手动输入),然后勾选,@后面填烧写地址0x00000SPI SPEED(SPI 速度)选择40MHzSPI MODESPI模式) 选择QIOFLASH SIZE(内存大小)选择32Mbit(换算成M,需要除以8,也就是4M,如果你买的esp32 wrover是其他容量,自行修改)DoNotChgbin(不改变bin文件)勾选,端口COM选择正确的端口(windows设备管理器-端口里面,有ch340的那个),BAUD(烧写速率)选择921600, 然后点击 “START”开始烧写。

 

 

 

(3)烧写完成后,会显示“FINISH 完成”,需要拔线或者手动关掉开关重启

 

(4)上述是首次使用esp32 wrover芯片教程,如果你之前刷过其他程序,可能调用了eeprom区,为防止数据异常,需要先点击“ERASE”进行清除,清除后再进行步骤(1)-(3)的操作。

 

 

2,程序使用

 

(1)将nes游戏固件拷贝到存储卡根目录,nes游戏名一般是.nes后缀的。

(2)开机后如果提示存储卡挂载失败(显示“Filesystem mount failed! try to restart.”),可以尝试重启,若两三次重启后仍然无法使用,请检查存储卡或者pcb电路。

(3)开机存储卡挂载正常后显示一张图片,显示”waiting”界面。
 
(4)这个界面下,使用left和right按键可以调整亮度,立即生效,left减10,right加10,亮度最小10,最大255,支持重启后记住之前的设定值。(按键定义参照之前的“4.appcardv3软件使用说明.pdf”,下同)

(5)这个界面下,按一次A键,则会浏览根目录文件,如果不是游戏文件,则会显示“Not a game file, please select again.”,需要继续按A键继续选择,直到出现.nes的游戏文件。

(6)出现.nes游戏文件名显示后,按mode按键即可开始游戏。

(7)后续根据游戏中的按键提示进行操作即可。

 

 

3,自行编译程序

 

(1),将libraries文件夹两个库文件放置arduino的libraries目录,否则会编译失败。

(2),arduino需要安装esp32开发板,教程自行搜索

(3),arduino编译时,板子类型选择 esp32 wrover module,com口选择正确。

 

 

好了,这就是esp32gamepad的内容,高清演示视频见:哔哩哔哩展示页

欢迎点赞和收藏

 

到这里还没完结,如果你手里只有esp32 wroom或者是其他屏幕怎么办,这里简单的讲述一下移植办法,新手可以跳过这部分内容。

 

第一步,先说明一下源代码文件包含什么

esp32gamepad.ino,主文件
controller.cpp,控制器,主要是按键类型和摇杆类定义
display.cpp,显示屏驱动文件
hw_config.h,文件系统定义,音频引脚及按键引脚
osd.c ,操作系统处理的一些函数
sound.c,音频系统一些函数

一般只需要修改esp32gamepad.ino,display.cpp,hw_config.h这3个文件

 

第二步,esp32 wroom和wrover区别

具体区别这里就不说了,这里只说2个,一个就是封装大小不同,如果你用wroom就得重新画原理图和pcb图了。

另外一个就是wroom没有psram(片外内存区,这个内存是运行内存,不是存储文件的那个内存),而wrover有。

psram有什么作用?游戏机处理是将nes文件加载到运行内存中的,一般小游戏文件一两百kb文件是没问题的,

但是游戏文件如果是1M呢,esp32默认的运行内存是装载不了的,这就需要片外ram了,psram大小有8M但是

实际只有4M可用,这样就足够1M大小的游戏文件运行了。

知道这点就好修改了,对应的文件是osd.c的28行内容

 

/* memory allocation */
extern void *mem_alloc(int size, bool prefer_fast_memory)
{
    if (prefer_fast_memory)
    {
        return heap_caps_malloc(size, MALLOC_CAP_8BIT);
    }
    else
    {
        return heap_caps_malloc_prefer(size, MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT);
    }
}

 

如果用wroom,将else里面的return改为和if里面一样的,同时注意游戏文件不能超过运行内容。

修改方法未验证,所以除非手里有多的esp32 wroom,否则建议还是直接买wrover完事。

 

第三步,屏幕移植

如果你用的其他屏幕(最低分辨率得240*240),想要移植的话

修改display.cpp文件,第47行else之后内容

 

#else

//显示屏亮度

#define TFT_BRIGHTNESS 128 /* 0 - 255 */

//显示屏控制背光引脚(背光负极)

#define TFT_BL 22

//显示屏驱动,定义spi引脚,miso可以不接为-1

Arduino_DataBus *bus = new Arduino_ESP32SPI(27 /* DC */, 5 /* CS */, 18 /* SCK */, 23 /* MOSI */, -1 /* MISO */);

//定义总线类型,其中rotation是旋转角度,IPS是否高清屏
Arduino_ST7789 *gamegfx = new Arduino_ST7789(bus, 26 /* RST */, 3 /* rotation */, false /* IPS */);

 

我的屏幕是7789,如果需要其他类型屏幕,可在库Arduino_GFX\src\display这个文件夹中查找,有列的就是支持的。

 

第四步,按键及文件系统修改

 

hw_config.h的第105行else之后开始

#else

//存储方式,21是SD的CS引脚,需要与显示屏的不同
#define FILESYSTEM_BEGIN SD.begin(21, SPI, 40000000, FSROOT); FS filesystem = SD;

//蜂鸣器音频
/* buzzer audio */
#define HW_AUDIO_BUZZER

//蜂鸣器引脚
#define HW_AUDIO_BUZZER_PIN 13
#define HW_AUDIO_SAMPLERATE 22050
// nofrendo minimum sample rate
//最低采样率,根据实际调整,默认22050

//按键引脚,X和Y我没用到,就分配到不使用的IO上了。
/* controller is GPIO */
#define HW_CONTROLLER_GPIO
//#define HW_CONTROLLER_GPIO_ANALOG_JOYSTICK
#define HW_CONTROLLER_GPIO_UP 39
#define HW_CONTROLLER_GPIO_DOWN 36
#define HW_CONTROLLER_GPIO_LEFT 35
#define HW_CONTROLLER_GPIO_RIGHT 34
#define HW_CONTROLLER_GPIO_SELECT 32
#define HW_CONTROLLER_GPIO_START 25
#define HW_CONTROLLER_GPIO_A 14
#define HW_CONTROLLER_GPIO_B 33
#define HW_CONTROLLER_GPIO_X 0
#define HW_CONTROLLER_GPIO_Y 2

 

音频有2种方式,一个是蜂鸣器,还有一个走DAC的,走DAC的可以参考注释的案例,注意引脚不能和其他引脚冲突。

 

 

 

 

 

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
flash_download_tool_v3.8.8.zip
897
2
固件程序.zip
301
3
源码及库.zip
600
4
屏幕等其他物料说明.txt
389
5
自制一个nes模拟器游戏机使用arduino编程的基于esp32系列 - 1.1641720617765.mp4(Av635525810,P1).mp4
5666
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航