1、简单易用,可快速上手
2、流畅支持300个器件或1000个焊盘以下的设计规模
3、支持简单的电路仿真
4、面向学生、老师、创客
1、全新的交互和界面
2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计
3、更严谨的设计约束,更规范的流程
4、面向企业、更专业的用户
标准版 基于esp32的arduino软件编程的nes模拟器游戏机
简介:基于esp32的开源NES游戏掌机,使用arduino软件编程,方便移植和DIY,游戏文件支持大文件(使用psram技术),游戏文件存放于存储卡中,游戏数量可以999+,充分享受游戏乐趣。
开源协议: Public Domain
基于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文件位置(不要手动输入),然后勾选,@后面填烧写地址0x00000,SPI SPEED(SPI 速度)选择40MHz,SPI MODE(SPI模式) 选择QIO,FLASH 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的可以参考注释的案例,注意引脚不能和其他引脚冲突。
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 |
展开
加载中...
是否需要添加此工程到专辑?