MAKER:DeanChu/译:趣无尽 Cherry(转载请注明出处)
这个作品的灵感来自PiGRRL Zero,Wermy原创的Gameboy Zero以及GreatScottLab的掌上游戏机。它们都是基于RetroPie系统的游戏机,都使用树莓派Zero(W)平台。但是,在我制作了几个Pi Zero游戏机后,发现了两个主要问题。
1、Raspberry Pi Zero(W)只是单核Cortex-A7和512MB RAM,这对于运行NES / SNES / GB这些程序还是可以的。但是,当我试图运行PS / N64 Emus时,那种卡顿的体验真的让人受不了。即使运行一些GBA游戏也不流畅(某些音频滞后,在一些NEOGEO的游戏比如Metal Slug处理复杂场景的时候也会延迟。);
2、大多数游戏机的显示界面都是使用SPI或TV接口输出。 SPI显示器需要CPU来帮助画面缓冲驱动,这会使游戏体验变的非常糟糕,而且帧率也受SPI时钟速度的限制。而TV接口输出的显示质量也不够好。
为了解决这个问题,我们将使用RaspberryPi Module 3和带DPI接口的LCD终极版RetroPie游戏机。它应该能够提供高分辨率和高帧率,并且顺畅的运行所有模拟器。
第1步:项目所需组件
以下就是组装掌上游戏机所需的组件。如果某些部件您没有,请用其它部件来替代。
- 树莓派 CM3 Lite 版
- 3.2英寸 LCD带RGB / DPI接口
- 轻触开关
- 按键若干
- 8欧0.5-1.5w扬声器
- 1000mAh锂离子电池
- IC若干, STM32F103C8T6,IP5306,TDA2822,NC7WZ16,SY8113,PT4103等
- 连接器若干,USB-Micro Female,PJ-237(电话插孔),TF-Card Jack,DDR2 SODIMM等
- 被动组件若干,电阻器,电容器和电感器
- 定制PCB
- 3D打印机,选择能够打印出尺寸为152 66 10毫米的零件
第2步:树莓派 CM3
树莓派 CM3 是一款功能非常强大的核心板,适用于进行原型设计的一些小玩意。该模块使用DDR2 SODIMM型连接器,该款使用起来稍微有些难度。此外, BCM2837内核的BANK1和BANK0的所有GPIO引脚均导出。
开始使用计算模块时,我们需要提供几种不同的电压:1.8V,3.3V,2.5V和5.0V。其中,1.8V和3.3V用于一些350mA的大功率外设供电。 2.5V用于驱动电视输出DAC,因为我们不需要电视输出功能,所以可以直接连接到3.3V。 5.0V应该连接到VBAT的引脚上,并为其核心供电。 VBAT输入接受的电压范围为2.5V~5.0V,务必确保电源输出要达到3.5W。我们使用3.3V CMOS,VCCIO引脚(GPIO_XX-XX_VREF)连接到3.3V,SDX_VREF引脚也连接到3.3V。
所有的HDMI,DSI和CAM引脚在这一步都不要连接。请将EMMC_DISABLE_N引脚连接到3.3V,因为我们将要把TF卡作为硬盘驱动器,而不是USB启动功能。
将SDX_XXX引脚连接到TF卡插槽上的相应引脚,不需要上拉或下拉电阻。在这一步,我们准备启动Raspberry Pi CM3.从最大电源依次开启:5V→3.3V→1.8V,然后系统可以启动,但是由于没有输出设备,我们还不知道它是否正常工作。所以,我们需要在下一步添加一个显示来检查它。
在继续之前,我们需要告知树莓派中每个GPIO的功能。我将提供了一些文件,取一个新的TF卡,在启动文件夹中放入“dt-blob.bin”,“bcm2710-rpi-cm3.dtb”和“config.txt”。将“dcdpi.dtbo”放在/boot/overlay文件夹中。 dt-blob.bin定义每个GPIO的默认功能。我们需要将GPIO14/15与LCD连接,把GPIO14/15更改为普通GPIO,并将UART0功能移至GPIO32/33。把GPIO40/41作为pwm功能,并将它们分别设置为右侧和左侧音频输出。dcdpi.dtbo是device-tree覆盖文件,我们将把GPIO0-25作为DPI功能。
编写“dtoverly = dcdpi”来告知树莓派加载我们提供的dtoverly文件。
OK,树莓派的每个GPIO每个细节都交代清楚了,我们继续前进吧!:)
第3步:连接LCD模块
由于这里可能使用到不同的DPI/RGB接口的LCD模块,因此我们将以自己使用的模块为例。如果您选择其他的,请注意模块的引脚,并根据引脚名称进行连接。
例如: LCD模块上有两个接口:SPI和DPI。 SPI用于配置LCD驱动器IC的初始设置,我们可以将它们连接到任何未使用的GPIO上。仅连接复位,CS,MOSI(SDA / SDI)和SCLK(SCL)引脚MISO(SDO)引脚不使用。为了初始化LCD驱动器,我们使用BCM2835 C库驱动GPIO并输出供应商为模块提供的特定初始化序列。源文件可在项目文件库可找到。
另外需要说明的是:根据说明在另一个树莓派3上安装BCM2835 C库。然后使用命令“gcc -o lcd_init lcd_init.c -lbcm2835”来编译源文件。然后在“exit 0”之前/etc/rc.local文件中添加一行:“/home/pi/lcd_init”(假设已将编译好的应用程序放在/home/pi文件夹下)。
这里强调的是,源文件仅用于我使用的特定模块,如果使用不同的LCD模块,就请按照供应商的要求进行初始化序列并相应地修改源文件即可。这个过程非常棘手,因为在屏幕上没有任何显示,这就是为什么我强烈建议您在RPI-CMIO板上这样做,因为它导出所有的GPIO,所以您可以用uart或wlan进行调试。
接下来就非常的简单了,将LCD模块连接到左侧引脚即可。具体还是取决于您的LCD模块,选择RGB模式是明智的。对我而言,我选择了DPI_OUTPUT_FORMAT_18BIT_666_CFG2(模式6)。您可以根据您的选择更改“dpi_output_format = 0x078206”。如果您的LCD模块使用不同的分辨率,请调整“hdmi_timings = 480 0 41 60 20 800 0 5 10 10 0 0 0 60 0 32000000”请参考此处的文件。
如果所有的设置都是正确的,那么下一次启动Pi时,等待30-40s黑屏(从电源系统加载SPI的初始化脚本开始)后,屏幕上就会有所显示。
第4步:按键和音频
在以上两个步骤中我们已经完成了核心和输出。现在让我们谈谈输入部分。
a.游戏机按键和按钮。
我们需要10个轻触开关作为上/下/右/左,LR和A/B/X/Y按钮。用普通的6×6键盘颗粒用于其他按钮,如启动/选择和音量增大/减小。
有两种方法可以将按钮与树莓派连接。
- 将按钮直接连接到Pi上的GPIO。
- 将按钮连接到MCU并通过USB HID协议与Pi连接。
我选择了后者,因为我们需要一个MCU来处理序列上的电源,使Pi远离人体的触摸,这样更安全。
因此,将按键连接到STM32F103C8T6,然后将MCU连接到Pi的USB上。在本步骤结束后可以找到MCU程序的一个例子。修改hw_config.c中的引脚定义,并找到的MCU USB库进行编译。或者,在文章后的原理图中共享相同的引脚定义,可以直接将hex文件下载到MCU。
b.音频输出。
Raspberry Pi 3B的官方原理图给出了过滤pwm的好方法,在这里同样的电路应该会运行的非常完美。需要指出的一点是,请记住在config.txt结尾处添加“audio_pwm_mode = 2”,以降低底噪。
我选择了TDA2822为扬声器驱动器,电路是官方的BTL电路。请注意,耳机插孔PJ-327在右侧输出端有一个自动分离引脚。当没有耳机插入时,引脚3连接到右声道。一旦耳机插入,该引脚就从右声道分离。此引脚可用作扬声器输入引脚,扬声器将在耳机插入时静音。
第5步:电源部分
一共设计了3个供电部分:MCU电源,充电器和DC-DC变压器。
a.MCU电源与所有其他电源分开,因为我们需要它执行预通电程序。当按下电源按钮时,PMOS将LDO的EN引脚连接到电池以启用LDO。然后MCU通电(按钮仍然按下)。在MCU启动时,要检查电源按钮是否按下足够长时间。大约2秒后,如果MCU电源按钮仍然处于按下状态,它将拉高 “PWR_CTL”引脚到PMOS。此时,MCU接管MCU电源的控制。
再次按下电源按钮2秒钟后,MCU将执行关机程序。在断电序列结束时,MCU将释放“PWR_CTL”引脚,使PMOS断开,MCU电源关闭。
b.充电器部件使用IC IP5306。此款IC采用2.4A充电和2.1A放电高度集成的Soc,适用于移动电源,完全符合我们的需求。该IC能够为电池充电,提供5V输出,并同时提供4个LED显示屏的电量。
c.DC-DC变压器,使用两个SY8113高效率3A变压器。输出电压可以通过2个电阻设定。为确保电源顺序,我们需要MCU先启用Booster。 KEY_IP信号将模拟按键到IP5306的KEY引脚,并启用内部5V加速器。之后,MCU将通过拉高RASP_EN引脚来使能3.3V降压。提供3.3V电压后,1.8V降压的EN引脚被拉高并启用1.8V输出。
d.电池。
两个1000mAh的锂离子电池,50mmx34mmx5mm。
第6步:安装系统
这一步,我们要将所有的东西安装完成。
a.将RetroPie图像下载并刷写到新的TF卡。
刷系统教程可以在这里找到。下载Raspberrypi 2/3版本。在图像闪烁后您会看到2个分区:FAT16格式的“引导”分区和EXT4格式的“Retropie”分区。
b.完成后,不要立即将其插入树莓派,因为我们需要为该ROM添加FAT32分区。
使用DiskGenius等分区工具将EXT4分区调整为大约5-6GB,然后制作一个新的FAT32分区,并在TF卡上留下所有可用空间。请参阅我上传的图片。
确保您的系统能够将TF读卡器识别为USB-HDD设备,并且您将在资源管理器中看到3个分区。其中两个是可访问的,Windows会要求你格式化左边的。不要格式化它!
c.首先打开“引导”分区并按照步骤2设置引脚配置。
您可以在此步骤下解压缩boot.zip,并将所有文件和文件夹复制到启动分区。请记得将已编译的lcd_init脚本也复制到启动分区。
d.准备第一次启动。
由于没有显示,我强烈建议您使用带有USB wlan设备的RPI-CMIO板。然后你可以配置wpa_supplicant文件并在这一步启用ssh。但是,如果你不打算这样,GPIO32/33也可以用作UART终端。将TX(GPIO32)和RX(GPIO33)引脚连接到USB转串口模块,并以115200的波特率访问终端。但无论采用哪种方式,你都需要访问终端。
在第一次启动时,系统在尝试扩展文件系统时会卡住。忽略它,按开始(USB HID的输入键)并重启。在终端上,将lcd_init脚本复制到用户“pi”的主文件夹,并按照步骤3设置自动启动。重新启动后,您应该看到屏幕亮起并显示一些内容。
e.游戏机已准备好播放。
为了将ROM和BIOS加载到TF卡中,每次都需要访问终端。为了简单起见,我建议你设置FAT32分区。
首先将/home/pi下的RetroPie文件夹备份到RetroPie-bck:“cp -r RetroPie RetroPie-bck”。然后在/etc /fstab中添加一行:“/dev/mmcblk0p3/home/pi/RetroPie defaults,uid = 1000,gid = 1000 0 2”将FAT32分区自动挂载到RetroPie文件夹并将所有者设置为用户“PI”。重新启动后,您会发现RetroPie文件夹的内容全部消失(如果不是,请重新启动),并在屏幕上显示一些错误。将RetroPie-bck中的所有文件复制回RetroPie并重新启动。错误应该消除,您可以按照屏幕上的说明配置输入设备。
如果你想添加游戏的ROM或BIOS文件,请在断电时拔掉TF卡并将其连接到计算机。打开第三个分区(记住要忽略格式化提示!!!)并将文件复制到相应的文件夹。
第7步:3D打印外壳和按键
a.GameBoy Micro风格外壳。
b.其他需要打印的物品
- ABXY键轻触开关 x4
- LR键 轻触开关x2
- CROSS键 轻触开关x1
- TOP键 轻触开关x1
- BOTTOM键 轻触开关x1
每个按键使用PLA打印,20% Fill,0.2mm 厚,确保它们足够坚固。
打印前请先用测试性的打印一些立方形来检查打印机的准确性。
需要3根5mm长的φ3mm的螺钉和4根10mm长的φ3mm的螺钉组装在一起。
第8步:将所有的硬件、软件组合在一起
由于电路有点复杂,所以最好做一些PCB准备工作。整个电路图和我自己的PCB版本在项目文件库中。如果您打算使用我的PCB版本,请不要删除Top_Solder图层上我的标记。
如果您是自己定制(最好的选择),把您自己的PCB文件交给本地制造商来做,因为很难购买到我在PCB上使用的所有部件。
所有组件焊接到PCB上并进行测试。
- 将hex文件下载到MCU。
- 将LCD模块粘贴在PCB上。 LCD模块应该装在盒子的PCB上方3mm处。用一层厚厚的双面胶带粘在上面即可。
- 将FPC连接到连接器并插入CM3L和TF卡。先不要焊接电池,插入USB电源并将其启动!检查所有按钮和显示。测量BAT+和GND之间的电压,检查电压是否在4.2V左右。如果电压正常,拔下USB电缆并焊接电池。试着按下电源按钮。
- 将CROSS和ABXY按钮放入TOP盒中,然后将PCB放入盒子中。用3颗螺丝将PCB固定在机箱中。在所有SKPDACD010按钮的背面粘上一些厚厚的双面胶带,并将电池固定在上面。请使用厚胶带避免SKPDACD010的引脚损坏电池。
- 将扬声器贴在BOTTOM盒子上。在关闭它之前,您可能需要尝试所有按钮,检查它们是否正常工作并弹出。然后用4个螺丝固定外壳。
到此所有步骤已经全部完成,感谢耐心看完!Enjoy!
故障温馨提示
1)重新检查原理图和PCB上LCD模块的引脚连接。
2)检查LCD信号线布线长度。
3)当你不确定电源部分时,请按照电源顺序进行焊接和测试。先是5V,然后是3.3V和1.8V。所有功率部分经过测试后,再焊接其他部件。
4)如果显示器画面频繁模糊,请尝试通过设置dpi_output_format来颠倒PCLK信号的机性。
5)如果显示器偏离中心,请尝试颠倒HSYNC或VSYNC信号的极性。
6)如果显示屏稍微偏离中心,请尝试调整扫描过的设置。
7)如果显示器显示为黑色,请尝试等待系统启动到rc.local脚本。如果你需要从显示器开始,请尝试将SPI连接到MCU,并使用MCU初始化LCD模块。
8)如果显示屏一直是黑色的,请再次检查初始化程序。
本项目所用到的PCB文件、3D模型等资源可在项目文件库中找到:
http://make.quwj.com/project/43
http://www.instructables.com/id/Retro-CM3-a-Powerful-RetroPie-Handled-GAME-Console/
bilibili 视频
发表评论