大数跨境
0
0

可能是目前最顶配的DIY树莓派游戏掌机:复古ComputeModule 3

可能是目前最顶配的DIY树莓派游戏掌机:复古ComputeModule 3 DF创客社区
2018-08-30
2
导读:手感超级好……
 

你的无限手套还缺一点,就能打响指


*项目作者:DeanChu

*资料来源:instructables


年前闲的无聊,看到了一些国外玩家做的基于树莓派和Retropie的游戏机,我也跟风做了一个用树莓派0(Raspberry Zero)的游戏机。



然而我发现了一些问题,树莓派0只有单核的Cortex-A7和512M的ram,跑跑一般的游戏模拟器还行,跑个PS或者N64着实卡的不行,甚至一些GBA游戏也会偶尔掉帧,受不了。


而且我发现大部分都用SPI屏幕,受限于SPI接口速率,一般的刷新速率和分辨率都不会太高,游戏体验一般般。所以我就用树莓派的计算模块3又做了一版,算是感觉还可以。


最终的游戏机尺寸为152x64x18mm,电池规格2000mAh。


步骤一:材料


材料清单:


  • 树莓派ComputeModule 3

  • 3.2英寸液晶显示器与rgb/dpi接口

  • 一个16GB TF卡

  • 开关

  • 电池

  • 连接器

  • 电阻等元件

  • 一个定制的PCB

  • 3d打印机


我自己有一台3D打印机,所以外壳仅花费了64克PLA材料。这个具体教程我已经发到了国外的Instructables上了,大家可以看原版:https://www.instructables.com/id/Retro-CM3-a-Powerful-RetroPie-Handled-GAME-Console/



这个机器能运行绝大多数的模拟器,要说额外能跑的,PS1、N64和部分PSP游戏基本能流畅运行,偶尔会有轻微掉帧,但是基本游戏体验是可以保证的。


这篇内容描述的是基于CM3的最初版本,现在已经到了第4版,还在优化中。

这个最初版的问题主要有3点:

1)屏幕分辨率是480x800,大部分游戏都有黑边(但是适合跑PSP游戏,新版改成了480x320,但是屏幕素质稍微差一点,而且gamma值供应商没给参考设置,正在调试中);

2)电源逻辑稍微有点混乱,支持边玩边充电,但是拔下充电器的时候会一瞬间切断主电源(充电芯片单电感充升方案的锅);

3)音质一般般,用的是树莓派3的PWM模拟声音输出,音质一般(新版改成了I2S接口的声卡芯片,调试中)。


最初版的PCB和对应的一些文件我都开源给出了,有兴趣的可以继续调下去,最新版的等我调试完成之后也会给大家一起分享。这些文件还请勿用于商业用途,推荐小范围组团拼板,但请保留我贴在板子Top Solder层的LOGO。




步骤二:树莓派CM3


对于制作一些小玩意,树莓派ComputeModule 3作为核心板非常强大。
这个模块使用了DDR2 SODIMM型号的连接器,不是很易用,但是却引出了芯片的所有BANK0和BANK1的引脚。



为了使用compute module,我们需要提供几个不同的电压:1.8V、3.3V、2.5V和5V。其中,1.8V和3.3V用于启动一些外部设备,每个大约350mA。2.5V的电源线用于驱动TV-out DAC,同时由于我们不需要TV-out的特性,电源线还可以接到3.3V上。5V的接到VBAT引脚上,为内核供电。VBAT接受的输入电压从2.5V-5V,但是确保供电输出能够到提供至少3.5W。因为我们用的是3.3V的CMOS电平,VCCIO引脚 (GPIO_XX-XX_VREF)可以被连到3.3V上。


在这儿所有的HDMI、DSI、CAM引脚都先不用,保持浮空。记得把EMMC_DISABLE_N引脚连到3.3V上,因为我们用TF卡作为硬盘。

接着,把SDX_XXX连接到TF卡槽相应的引脚上,不需要上下拉电阻。
用5V、3.3V、1.8V递减的顺序上电,系统应该可以启动起来。但是由于没有输出设备,我们无法知道是否运行良好。因此,在接下来的一步中,我们需要添加一个显示器来检测。



在继续之前,我们首先需要告诉Pi每一个GPIO的功能是什么。最后的压缩包里有这些文件,在一个新刷Retropie的TF卡的启动文件夹中加入 "dt-blob.bin","bcm2710-rpi-cm3.dtb" 和 "config.txt"。然后,在/boot/overlay文件夹中输入"dcdpi.dtbo"。dt-blob.bin定义了每个GPIO的默认功能。由于需要GPIO14/15与LCD模块连接,我把GPIO14/15改成了常规GPIO,把UART0功能移到了GPIO32/33。同时,我让Pi使用GPIO40/41作为pwm功能,让它们成为左右声音输出。dcdpi.dtbo是一个设备树文件,它告诉Pi我们将会使用GPIO0-25作为DPI功能。最后,我们编辑"dtoverly=dcdpi"让Pi加载我们提供的文件。(所有文件在boot.zip文件解压后都在,按照文件夹放好了)


这时候,树莓派已经完全理解每个GPIO该用哪个功能了,可以进行下一步了。


步骤三:连接LCD模块


由于本游戏机中会使用不同DPI/RGB连接的LCD模块,在这里我使用了我自己的模块为例。如果你用的跟我不一样,需要检查你的模块的引脚定义,然后如示例中展示的一样根据引脚名称连接起来。



在LCD模块上有两个接口:SPI和DPI。SPI用于配置LCD驱动电路板的初始设置,我们可以把他们跟任意一个不用的GPIO连接起来。只连接重置、CS、MOSI(SDA/SDI)和SCLK(SCL)引脚,MISO(SDO)引脚是不需要用的。为了初始化LCD驱动,我们用了BCM2835 C Library来驱动GPIO,输出是一个特定的由模块供应商提供的初始化序列。



按照说明书可以在另一个树莓派3中安装BCM2835 C Library。使用指令"gcc-o lcd_init lcd_init.c -lbcm2835"编辑源文件,然后把编译好的文件放到你准备的TF卡的/home/pi文件夹下。在卡里的文件/etc/rc.local的“exit 0”之前新添加一行:"/home/pi/lcd_init"(假设你已经把编译程序放到/home/pi文件夹下了)。这里要强调的是,这个源文件只被用于我使用的特定模块,对于不同的LCD模块,需要问卖家要初始化序列然后相应修改源文件。这道程序很麻烦,因为此时屏幕上什么也不会显示,因此我强烈建议你用RPO-CMIO板完成,毕竟它导出全部的GPIO,你可以用uart或wlan来调试。


剩下的步骤很简单,只需要连接LCD模块的引脚。大家可以根据自己的LCD模块种类来灵活选择RGB模式,我选择了DPI_OUTPUT_FORMAT_18BIT_666_CFG2(模式 6)。根据自己的选择来更改"dpi_output_format=0x078206"这行,需要注意的是各个信号的极性,特别是时钟PCLK。然后,如果你的LCD模块使用了不同的分辨率,需要调整"hdmi_timings=4800 41 60 20 800 0 5 10 10 0 0 0 60 0 32000000",具体参照这里。
如果所有的设置都正确,下一次启动Pi的时候,在30-40秒的黑屏(从电源到系统加载SPI初始化脚本)之后就会看到屏幕上的显示了。



步骤四:按键和音频


一个游戏机需要一些按键。在这我们需要10个 ALPS SKPDACD010开关作为上下左右、LR和A/B/X/Y按键。其他的按钮像开始/选择和音量键用的是常规的6x6表贴按钮。

有两种方式连接树莓派到这些按键——一是直接连接按键到Pi上的GPIO,二是把按键连接到一个MCU上,再通过USB HID协议连接到Pi上。我选择第二方案,因为我本来就需要MCU来解决上电时序,所以不妨用他顺便完成这些功能。
因此,我们要把按键连接到STM32F103C8T6,再把MCU连接到Pi的USB上。在后面我提供了一个MCU程序的示例。你可以在hw_config.c里更改引脚定义,也可以参照MCU的USB library进行编译。或者如果你跟我用的相同的引脚定义,你可以直接在文末的下载到hex文件。



至于音频输出,树莓派3B官方的原型图给出了一种很好的过滤pwm波的方法,并且该电路在我们这可以完美运行。需要指出的是,切记在config.txt文件末尾添加 "audio_pwm_mode=2" 线,以便降低音频输出的噪音。
为了启动扬声器,我们需要一个扬声器驱动。我选择的是TDA2822配了官方的BTL电路。注意,听筒插孔PJ-327在右侧输出上有一个自动分离引脚,当没有耳机插入时,引脚3连在右声道上。一旦耳机插入,引脚便从右声道分离。这个引脚可以作为扬声器输入引脚,耳机插入时扬声器便可以静音了。
(不贴图了,直接看后面的原理图吧)


步骤五:电源



下面进入电源部分,我们来看看详细的电源设计。
电源分三个部分:单片机、充电器/升压器和DC-DC Bucks.


单片机供电从其他种类的电源里分出来是因为我们需要它来呈现pre-powerup效果。当电源按钮按下时,PMOS会把LDO上的EN引脚连接到电池上,从而启动LDO。单片机也就启动了(持续按着按键)。单片机启动时,它会检查电源键是否按得足够长时间。大约两秒之后如果单片机检测到电源按钮仍然是按下的,它会拉起 "PWR_CTL" 引脚来保持PMOS开着。此时,单片机开始控制单片机的供电。
当电源键再次被按下2秒时,单片机将会逐渐切断各个电源。最终,单片机释放"PWR_CTL"引脚使PMOS关掉,单片机也就断电了。
充电器/升压器部分使用IP5306电路。该电路是2.4A充电、2.1A断电并且充分整合移动电源的Soc用量,完全满足我们的需求。这个电路可以给电源充电,提供的是5V输出同时有4个LED电量指示灯。
DC-DCBuck 部分用了两个高效率SY8113 3Abuck.输出电压可以由两个电阻调节。为了保证上电时序,我们首先需要让单片机启动升压器。KEY_IP信号会给按键引脚IP5306一个模拟按键响应来启动内部5V的升压器。之后,单片机会通过拉高RASP_EN引脚启动3.3V buck。有了3.3V电压之后,1.8V buck的EN引脚被拉高,输出1.8V电压。
至于电池,两个1000mAhLi-ion batter对这个游戏机来说足够了。电池的常规规格的是大约50*34*5mm。



步骤六:设置TF卡



首先,你需要下载并在一个新的TF卡里刷入RetroPie镜像。教程和下载可以在Retropie官网找到。下载树莓派2/3版本。在刷入镜像之后,你将会看到两个分区:一个FAT16格式的“boot”分区和一个EXT4格式的“RetroPie”分区。
完成以上步骤后,不要立即把它插入树莓派,我们还需要为ROMS添加FAT32分区。使用DiskGenius等分区工具来调整EXT4分区到大约5-6GB大小,然后用TF卡剩下的全部空间做一个新的FAT32分区。

确保你的系统能够把TF卡读卡器识别成一个USB-HDD设备,然后你就能在浏览器中看到3个分区。其中的两个是可以访问的,windows会让你格式化剩下的那个。万万不要格式化!
首先,打开“boot”分区然后根据第2步设置引脚的配置。或者你可以在本步骤解压boot.zip,再复制全部的文件和文件夹到你的boot分区。记得也把编译后的lcd_init脚本复制到boot分区中。
到此我们已经准备好首次上电,但由于没有显示器,我强烈建议你用一个带有usb wlan设备的RPO-CMIO板。然后你可以配置wpa_supplicant文件然后启动ssh,可以去哔哩哔哩找视频教程。然而,如果你不想弄一个这玩意,GPIO32/33可以作为UART终端。把TX(GPIO32)和RX(GPIO33)引脚连接到usb-to-uart板上,调制终端波特频率到115200。总之,通过某种方式连接到树莓派的Termianl上。
在第一次启动时,在系统试图扩展分区时,系统会卡住。可以忽略它,按开始键(USB HID键盘的enter键)重启。在终端,复制 lcd_init 脚本到用户Pi的Home文件夹,然后按照步骤3设置自动开始。再一次重启之后,你可以看到屏幕亮了并且显示了内容。
这时,你的游戏机已经可以玩了。不过呢,为了在TF卡上加载rom和BIOS,每次你都需要终端连接。为了让这个简单一点,我建议你搞一个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"上添加新的一行,通过设置所有者为用户“pi”在RetroPie文件夹内自动挂在FAT32分区。重启之后,你会看到一个RetroPie文件夹的内容都没有了(如果还有,再次重启),屏幕上会显示一些错误。再把RetroPie-bck里的全部文件复制回RetroPie,然后再次重启。这时候错误会消失,你可以按照屏幕指示配置输入设备。
如果你想要添加rom或BIOS,在断电后拔出TF卡,然后把它连到电脑上。打开第三个分区(记住,忽略格式化提示),复制文件到相应的文件夹。



步骤七:3D打印的案例和按钮



用PLA来打印,20%的填充,0.2毫米的层,它足够坚固。

打印完成后,需要把它们组装在一起。


步骤八:其他配件制作


由于电路有点复杂,用PCB。整个原理图和我自己的PCB版本都在结尾处。最好能定制你自己的PCB,然后把你的PCB文件交给生产商制作,因为真的很难买到全部一样的元件。


在焊接并测试了PCB上的所有元件之后,首先要下载hex文件到单片机,再把LCD模块粘贴到PCB上。然后把FPC连接到连接器上,并插入CM3L和TF卡。先不要焊接电池,插一个USB电源然后启动。



检查所有按键和显示。测量BAT+和GND之间的电压是否在4.2V左右。如果电压没问题,拔掉usb电线然后焊上电池,试一下电源键。



把CROSS和ABXY键放在外壳正面,再把PCB板放入外壳并用三个螺钉固定住。在SKPDACD010按钮背后贴上双面胶,并把电池粘上。切记用厚双面胶,避免SKPDACD010的引脚戳坏电池。然后把扬声器黏在外壳底部。在合上外壳之前,你可能需要试一试所有的按键,检查它们是否运作或弹起良好。最后,用4个螺钉合上外壳。


FAQ:

1) 反复检查LCD模块与原理图和PCB的引脚连接。
2) 用 LCD信号线尽量做等长
3) 当你对供电部分不确定时,按上电时序焊接并测试每一个部分,从5V到3.3V到1.8V。在所有的供电部分都测试后,再焊接其余部分。
4) 若显示总是模糊不清,试着通过设置dpi_output_format来调整PCLK信号灯的极性。
5) 若显示偏移中心太多,试着调整HSYNC或VSYNC极性。
6) 若显示略微偏移中心,调整一下Overscan设置。
7) 若显示器黑屏,等待系统启动rc.local脚本。如果你需要从一开始就显示,试着把SPI界面和单片机连在一起,用单片机初始化LCD模块。
8) 若显示屏一直黑屏,再次检查初始化代码。
9) 有问题可以在下方提问或邮件联系作者:zhudi_bupt@163.com



*欢迎转发朋友圈。如需转载,请注明出处和原作者。


项目干货戳这里

磁悬浮盆景 | LED项链

骨骼追踪抛物预判垃圾桶

 动画电子勋章 三角轮胎 | 物联伺服器

 物联网体重计 Vision Kit开箱 | 弹球机

吃币机器人| 红白游戏机  

DIY树莓派游戏机 |Teleroomba 波士顿动力

 家庭萌宠Pando | DIY迷你装载机 

物联网项目精选 | Switch重度患者拯救指南 | 手相之诗

自制酸奶机 wifi 气象站 | 极简感应灯 | lululu时钟鹿


点击“阅读原文”,更多创客项目!

【声明】内容源于网络
0
0
DF创客社区
我们是专注于创新和开源硬件开发的公司——DFRobot成立的创客社区,无论你是资深创客还是小白,这里都有你的一席之地。一个人玩自己的项目,你只是寂寞宅;一群人看你玩项目,你就是技术牛!快来分享你的项目吧!
内容 1282
粉丝 0
DF创客社区 我们是专注于创新和开源硬件开发的公司——DFRobot成立的创客社区,无论你是资深创客还是小白,这里都有你的一席之地。一个人玩自己的项目,你只是寂寞宅;一群人看你玩项目,你就是技术牛!快来分享你的项目吧!
总阅读2.4k
粉丝0
内容1.3k