×

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.obk20.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.obk20.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);