×

PALPi复古游戏机开源分享

消耗积分:0 | 格式:zip | 大小:0.23 MB | 2022-11-14

分享资料个

描述

介绍

嘿大家怎么了!

所以这是我基于 RecalBox 的手持游戏机,又名PALPi

它的名称是 PALPi,因为它使用复合 PAL 显示器。

当我小的时候,我喜欢玩口袋妖怪、魂斗罗、超级马里奥、最终幻想等游戏,以及其他主要在 Gameboy Advance 上的游戏,以及我们与 CRT 电视连接以运行伟大的旧东西的游戏机。

好吧,现在我们可以下载复古游戏ROM并在模拟器中打开它,然后在我们的笔记本电脑和移动设备上玩那个游戏,

但作为一个创客,我想做一些不同的事情,

所以我准备了这个由树莓派零驱动的手持式复古游戏机设置,我在这里使用的操作系统是 Recalbox 操作系统。

这是一个不错的模拟器操作系统,还附带了一些预加载的游戏。

整个设置由 IP5306 IC 供电,这是一个 5V 2A 恒定升压 IC。它用于移动电源电路,非常适合为 Raspberry Pi 零供电。

所以在这篇文章中,我将向你们展示如何设置这个游戏机并制作一个完整的掌上游戏机,它可以模拟你能想象到的任何复古游戏。

所需材料

这些是我们构建所需的东西

  • 树莓派零
  • 16GB 存储卡(8GB 也可以,但我想在其中添加很多游戏,所以我选择了这个)
  • 电视
  • HDMI 转微型 HDMI 适配器
  • 5V 2A 充电器/移动电源,可输出稳定 2A
  • 键盘
  • USB 转微型 USB 适配器
  • RecalBox 操作系统图像文件/ Raspberry Pi Image Flasher
  • 常规按钮
  • 定制PCB
  • IP5306集成电路
  • 10uf 0805 电容器
  • USB端口
  • USB 微型端口
  • 带 CON2 连接器线的锂离子电池
  • CON2 连接器
  • 10k 0603 电阻
  • 2R 0805 电阻
  • 垂直按钮

基本设置

pYYBAGNxInyAOzNxAAhFE_gwwaU009.jpg
 

这就是我想做的,一个陈词滥调的 Gameboy 布局。

我在这个设置中使用了一个 4.3 英寸的显示屏,如果与普通的 Gameboy 屏幕相比,它是相当大的,所以这个设置的尺寸约为 135 毫米 x 140 毫米。

在正面,有一个显示器和按钮,在底部,将放置树莓派零以及升压转换器电路和锂离子电池。

此设置是 PCB 和 3D 打印主体的组合,它们将通过 PCB 中给定的安装孔通过螺钉连接在一起。

设置 RecalBox

 

如果 Raspberry Pi 是这个项目的大脑,那么 RecalBox 就是心脏。

我只是为这个设置制作硬件,已经有很多其他类似的基于Recalbox OS的 Gameboy 站

原因很简单,设置 RecalBox 是一件非常容易的事情,我们只需要在操作系统中调整一些东西就可以运行某些东西。

这是为您的树莓派安装Recalbox的方法!

  • 下载 Raspberry Pi 成像器。
  • 为您的设备选择正确的操作系统,即 RecalBox
  • 选择您的系统,即 Rpi0
  • Raspberry pi imager 将完成您在存储卡上下载和安装 RecalBox 的工作。

安装RecalBox os后,您需要将 Raspberry pi 设置插入电视和键盘。

启动整个设置后,我们的 RecalBox 就像一个普通的模拟器一样工作。

基本 GPIO 接线示意图

poYBAGNxIn6ANsyfAAHDW-RrsoE980.jpg
 

这是我们必须用于 GPIO 按钮的示意图。

当我们将任何 GPIO 引脚下拉到 GND 时,该按钮就会起作用。

显示和 GPIO 控制

 

现在来说说外接显示器,因为这个项目显然有两颗心,第二颗心就是显示器。

说到显示器,我们可以找到一堆显示器,既用于 HDMI 端口,也用于带状电缆。它们都工作得很好,但对于这个项目,30 美元的显示器并不理想,所以我买了一个便宜的车载显示器,它有一个复合 PAL 端口。

poYBAGNxIoaAMb0XAAea7RX7p0Q994.jpg
 

是的,我在这里使用复合 PAL 端口,我正在制作复古游戏机,FPS 在这里并不是真正的问题,所以复合现在是我最好的朋友,友谊以 HDMI 端口结束

poYBAGNxIoiAUu2nAAB0Ct-ACfQ748.png
 

在用 Rpi 连接车载显示器之前,有一个小问题。

车载显示器使用 12V,我们需要 5V 或 3.3V 显示器。

所以我打开显示器并搜索它的 IC,发现显示 IC 使用 3.3V 工作,并且此设置中有降压转换器 IC,用于将 12V 降压至 3.3V 进行显示。所以我移除了那个 IC,在 Vout 电容器上添加了 VCC 和 GND,并为这个显示器提供了 5V 电压。

pYYBAGNxIoyAKxtQAAZiEdsGeac684.jpg
 

显示器工作正常,现在我们可以用 5V 操作它。

为了运行 PAL 复合显示,我们需要在配置文件中编辑一些内容。

我们将需要一个键盘来在网络设置中输入 SSID 和密码.. 将其与 win SCP 连接。

通常,我们只需将 HDMI 显示器连接到我们的 Raspberry pi 并输出其视频信号,但在我们的情况下,我们需要将 SDTV 输出设置为默认值。

这是你需要编辑的!

  • 标清电视

转到boot>config.txt并以此更改默认设置。

我们从 sdtv_mode 中删除 # 并添加 sdtv_aspect=1,此外,我们在 HDMI 线前面添加 #。

pYYBAGNxIo6AI0B2AAFoKhdyZt0134.png
 
  • GPIO 控制

recalbox>share>系统>recalbox.conf

poYBAGNxIpCAagaoAAGD1k-uKVY165.png
 

对于启用 GPIO 按钮,我们只需要在上面的部分中更改两件事。

设置controller.gpio.enabled = 1 (之前为 0)并将controller.gpio.args.map=1, 2更改controller.gpio.args.map=1 (2 是第二个玩家控件)

只需根据我的更改您的默认设置,然后重新启动整个设置,然后砰,我们的 Recalpi 设置适用于复合 PAL 和自定义按钮!

设置面包板版本

在设置面包板版本之前,覆盆子 pi 引脚排列看起来像这样!

pYYBAGNxIpOASG-GAAHW5_I9veU056.png
 

但我使用的是自定义 GPIO 适配器(我由公母头针制成),当我们在 Raspberry Pi 的 GPIO 接头上添加这个适配器时,我们的 Raspberry 被倒置,引脚排列变成这样 - (倒置)

pYYBAGNxIpaAVjwDAAIVGHt5iFM117.png
将每个按钮与 GND 和提到的 GPIO 引脚连接
 

每个按钮都添加在 GPIO 引脚和 GND 之间,通过按下按钮,连接的 GPIO 引脚接地。

 

接线后,我们可以将此设置与 HDMI 显示器连接并测试按钮是否正常工作。

一切似乎都很好,所以在此之后,我断开了树莓派与 HDMI 显示器的连接,并将车载监视器显示视频线添加到树莓派的复合输出端口上

  • VCC 将变为 5V
  • 地到地。

现在用任何 5V 2 A 电源和 BANG 为 pi 供电。

复合显示器正在工作!(不要忘记更改配置文件中的 sdtv 设置)

 

PCB版

poYBAGNxIpmAfA1RAAL1_4Dv90E180.jpg
 

这是上述面包板版本/设置的 PCB 版本,其中有 13 个按钮与 Rpi 零连接。

之前的设置由包含 IP5306 IC 的移动电源供电。

我在网上搜索了那个IC,发现它是一个用于3.7V锂离子/锂聚合物电池的电源管理IC,它有一个带有电池百分比指示器的充电指示,最重要的是,电池的高低切断。

因此,我在设计中添加了 IP5306 最小设置,并使用它来将 3.7V 锂离子电池提升至 5V 2A,用于 Raspberry Pi 和 Display。

 
 
 
pYYBAGNxIpuAdt_3AAG7Drsvmmg066.png
 
1 / 3
 

我首先在 Fusion360 中设计了整个结构,然后使用 Fusion360 中的 PCB 布局在 My PCB Cad 软件中对 PCB 轮廓进行建模。

我在经典的 Gameboy 布局中放置了按钮,并带有一个额外的热键按钮。

完成 PCB 后,我将其 Gerber 数据上传到PCBWay 的 PCB 报价页面,并订购了 5 块黑色阻焊层的 PCB。

 

我在一周内收到了这些 PCB,速度非常快,我不得不说,我收到的 PCB 和预期的一样棒!

PCBWay 你们摇滚,查看PCBWay以更低的成本获得出色的 PCB 服务。

下一步是PCB组装

PCB组装

因此,在收到 PCB 后,剩下要做的就是这块板的组装过程,其中包含两个主要步骤。

第 1 步是 SMD 元件焊接,第 2 步是 THT 元件焊接。

对于第 1 步,我将使用我的 Hotplate 将 SMD 元件焊接到 PCB 上,但在此之前,我们需要先将焊膏逐个涂抹到每个元件焊盘上。

 
 
 
 
1 / 4SMD 工艺,看下一张幻灯片
 

在此之后,我们需要按照正确的顺序,一个一个地手工将每个组件仔细挑选并放置在它们指定的位置上。

接下来,我们需要小心地提起这块 PCB 并将其放置在 SMD 热板上进行回流。

热板将 PCB 从底部加热到焊膏熔化温度。

当焊膏熔化时,我们需要将 PCB 从热板上取下并让它冷却约 3-4 分钟。

现在在第 2 步中,我们将 THT 组件添加到此 PCB,它们是 USB 端口、按钮和电池连接器,然后我们焊接它们的焊盘。

 
 
 
 
1 / 2
 

此外,我确实订购了 Raspberry Pi GPIO 插头引脚插座,但由于印度的大流行封锁,它尚未交付,所以我将使用两个插头引脚,每个引脚包含 20 个端口。

 

焊接完所有端口后,我们的 PCB 就完成了。

现在我们插入锂电池并在 USB 端口添加一个 USB 电源监视器,正如我们所见,我们的 USB 输出为 5V,指示灯 LED 也正常工作。

现在我们在这个 PCB 上添加这个项目的主要组件,它是一个 Raspberry pi 零 W,它已经包含安装的 RecalBox,并对配置文件进行了必要的更改。查看此项目页面以获取有关配置文件的更多信息或观看上一个视频。

这是我们的主板,前面已经完成了定制丝网印刷,看起来已经非常棒了。现在我们在我们之前制作的游戏控制器主体上添加这个电路,就是这样。

我们用四个自锁 M2 螺钉将这个电路安装在主体上,然后将显示器的 VCC GND 和 PAL 端口与我们的 Rpi 和电路连接。

我们的设置现在已经完成。

我们通过按下 ON-OFF 垂直按钮打开我们的设置,Recalbox 正常启动,并且我们的按钮正常工作。

现在让我们在这个游戏控制器上玩 POKEMON EMERALD。

结果

添加更多游戏

要添加更多内容,我们首先需要下载您想在此游戏机上玩的任何游戏的自定义 ROM。例如,我下载了龙珠高级冒险。然后我们首先需要将 Recalbox 连接到我们的 WIFI 路由器。

  • 转到设置>网络设置然后添加您的 WIFI 凭据。
  • 添加路由器的 SSID 和密码后,您的树莓派将连接到互联网,您将在网络设置菜单顶部看到其 IP 地址。
  • 在你的电脑上打开 Win SCP,在上面输入树莓派的 IP 地址,用户名是root,树莓派的密码是recalboxroot。
  • 现在转到这个菜单recalbox>share>rom,它包含所有 ROM 文件夹,我想在其中添加 pokemon Emeral,它在 Gameboy Advance 上运行,所以我不得不将它的 ROM 文件复制粘贴到 GBA 文件夹中。
  • 现在重新启动您的树莓派设置并打开 GBA 模拟器菜单,您将看到新添加的游戏。
poYBAGNxIr6AKOqmAA75UyxYXb4660.jpg
 

通过这样做,您可以在 Recalbox 中模拟很多好东西,只需确保将游戏 rom 粘贴到其正确的模拟器中即可。

下一步是什么?

这个设置确实有效,我对它的性能非常满意。目前,它的显示还可以,还不错,但分辨率不是很好。

下个版本会有更好的显示器,由于成本原因,我在这个项目中没有使用更好的显示器。

此外,下一个版本将采用更纤薄、更好的整体 PCB 版本,显示器安装在 PCB 上或类似的东西上。不完全确定,但会更好。

如果您需要有关此项目的任何帮助,请发表评论,请查看此项目视频以获取更多详细信息。

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'PALPi复古游戏机开源分享',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);