编辑器版本 ×
标准版

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

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

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

开源协议: Public Domain

发布时间: 2022-07-02 16:34:23
  • 9.3k
  • 47
  • 124
描述

基于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的可以参考注释的案例,注意引脚不能和其他引脚冲突。

 

 

 

 

 

设计图
原理图
1 /
PCB
1 /
暂无
ID Name Designator Footprint Quantity BOM_Supplier Part
1 K2-1817UQ-C4SW-01 ABTN,BBTN,DOWNBTN,LBTN,MODEBTN,RBTN,SELBTN,STABTN,UPBTN KEY-SMD_2P-L6.0-W6.0-P6.00 9 C128939
2 4mm BUZZER1 BUZ-TH_BD9.0-P5.00-D0.6-FD 1 C252932
3 1uF C1,C2,C3,C7,C10 C0603 5 C1592
4 0.1uF C4,C5,C6,C9 C0603 4 C1591
5 10uF C8,C11 C0603 2 C85713
6 TF-01A CARD1 TF-SMD_TF-01A 1 C91145
7 X8821WV-02K-N0SN CN1 CONN-TH_2P-P2.50_X8821WV-02K-N0SN 1 C388748
8 18p0.5mm FPC1 FPC-SMD_18P-P0.50_F0502-B-18-20T-R 1 C512918
9 LED-0603_R LED1 LED0603_RED 1 C72044
10 LED-0603_G LED2 LED0603_GREEN 1 C72043
11 S8050-J3Y Q1,Q2,Q3,Q4 SOT-23-3_L3.0-W1.7-P0.95-LS2.9-BR 4 C364312
12 10K R1,R2,R3 R0603 3 C25804
13 10k R4,R5,R6,R9,R15,R16,R17,R18,R19,R20,R21,R22,R23 R0603 13 C25804
14 5.1K R7,R8 R0402 2 C325521
15 1R R10 R0603 1 C177288
16 1.2K R11 R0603 1 C269681
17 1K R12,R13 R0603 2 C269704
18 220R R14 R0603 1 C22962
19 SK-3296S-01-L2 SW1 SW-SMD_SK-3296S-01-L2 1 C500051
20 ESP32-WROVER_C503590 U1 WIFIM-SMD_39P-L31.4-W18.0-P1.27 1 C503590
21 CH340C U2 SOP-16_L10.0-W3.9-P1.27-LS6.0-BL 1 C84681
22 XC6210B332MR U3 SOT-25_L3.0-W1.6-P0.95-LS2.8-BL 1 C424705
23 PT4056 U4 ESOP-8_L4.9-W3.9-P1.27-LS6.0-BL-EP 1 C351416
24 TYPE-C16PIN USB1 USB-C-SMD_TYPE-C16PIN 1 C393939

展开

工程成员
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

  • 开源平台公众号