用PICO W驱动自定义的VGA驱动设置,制作了一个《太空侵略者》风格的游戏
这是PICO VGA BLASTER,一款DIY复古游戏机,可在VGA显示器上运行街机风格的游戏。
这个项目基于我之前制作的PICO VGA板,该板将树莓派Pico连接到DSUB15接口,用于驱动VGA显示器并作为普通显示屏使用。通过保留原有项目,并添加一个按钮板以及进行一些修改,我最终打造出了这款复古风格的游戏主机。
我专门为这款主机制作了一款定制游戏(PICO VGA BLASTER)。游戏 loosely loosely loosely 基于原版《太空侵略者》,但有个小改动:外星人是呈VGA端口形状的生物,入侵了地球,而我们的任务就是保卫地球。
我的控制台有六个按钮:四个方向键用于操控飞船,两个按钮用于发射导弹和子弹。
没有背景故事的游戏会显得乏味,因此我为游戏创作了完整的剧情设定和开场序列,让整个体验呈现出复古街机战役的氛围。
电源方面,需要通过VGA板上的直流 barrel 接口提供12V输入;显示器方面,我们使用的是标准的27英寸LED显示器。
在住房方面,我甚至设计了一个定制的外壳,然后用3D打印零件并组装了整个结构。本文将介绍该项目的完整建造过程,让我们开始动手吧。
所需材料
本项目所使用的组件如下
•VGA PICO 板PCB(由NEXTPCB提供)
•按钮板(由NEXTPCB提供)
•12x12 触摸式按钮
•WS2812B LED灯
•100nF 电容
•3D打印零件
•12V适配器
•D-SUB 15 VGA 接口
•直流桶式插头
•330欧姆电阻 1206封装
•10k 电阻 0805 封装
•1K电阻 1206封装
•LED 绿色 0603
•Female header Pins CON20 x 2
•PICO 1 或 PICO W(任一型号,带 RP2040)
PICO VGA 板 1.0
我们项目的核心是之前开发的PICO VGA板1.0,我将D-SUB15接口与树莓派Pico连接,用于驱动VGA显示器,其使用方式与普通OLED或LCD屏幕完全相同。通过该板,我们可以将全尺寸VGA显示器集成到我们的项目中。
PCB设计 - PICO VGA板 1.0
让我们来看看PICO VGA板1.0的PCB设计。我将一个D-Sub 15针VGA连接器直接连接到树莓派Pico,以生成VGA视频输出。
VGA通过三个模拟信号工作:红、绿和蓝。每条信号线的电压范围为0V到0.7V,其中0V表示无亮度,0.7V表示最大亮度。通过组合这三种信号,显示器可以为每个像素重现不同的颜色。例如,仅将红色信号线设置为0.7V可得到纯红色,而将三条信号线全部设置为0.7V则可产生白色。
除了RGB信号外,VGA还需要两个数字同步信号:HSYNC(水平同步)和VSYNC(垂直同步)。HSYNC告诉显示器何时开始新的一行,而VSYNC则表示新一帧的开始。显示器会持续逐行绘制像素,每秒刷新整个屏幕约60次。
我将Pico的GPIO18、GPIO19和GPIO20连接到VGA接口的第1、第2和第3引脚,分别对应红、绿、蓝信号。在这些连接之间,我添加了电阻网络以实现合适的电压控制。每条RGB线路使用三个并联的330Ω电阻,通过增加或减少电阻即可轻松调节阻值,同时保持所有RGB通道的平衡。
为了实现同步,VGA接口的引脚13(即HSYNC)连接到Pico的GPIO16,而引脚14(即VSYNC)连接到GPIO17。引脚5、6、7、8和10均连接至地。
我还添加了一个CON15分线连接器,连接到所有15个VGA引脚,便于测试或未来扩展时单独访问各个VGA信号。此外,我还增加了额外的接头,连接到Pico板上未使用的GPIO引脚,以便日后可用于其他外设或未来项目。
为了实现电源调节,我在电路板上添加了一个LM317可调电压稳压器。该稳压器能够提供超过1.5A的电流,并支持从1.25V到37V的可调输出电压范围。
我们设置LM317的方式是,当输入12V时,可输出稳定的5V,用于为Pico供电。
PCB设计 - 按钮板
本项目中我使用的第二块PCB是按钮板,该板是我从摩托罗拉DynaTAC项目中重新利用的。我在一块定制PCB上增加了六个按钮。所有按钮均连接至GND,其余引脚则连接到CON7接口,用于将按钮与微控制器(即PICO VGA板)进行通信。
我们还添加了六个WS2812B RGB LED灯,以实现额外的照明效果和视觉反馈。
NextPCB PCB 服务
两块PCB的Gerber数据已发送至NextPCB总部,已下单订购红色焊锡掩膜和一块绿色焊锡掩膜的电路板。
下单后,PCB在一周内就收到了,质量相当不错。
此外,我还必须向您介绍HQDFM,它在许多项目中为我提供了很大帮助。华秋的内部工程师开发了免费的“面向制造的设计”软件HQDFM,彻底改变了PCB设计人员可视化和验证设计的方式。
抓住NextPCB的加速活动机会,为您的创新项目免费获得2块组装好的RP2040电路板。
本服务涵盖所有费用,包括物流成本,让您更轻松、更经济地将创意变为现实。SMT服务可能价格较高,但NextPCB将助您顺利克服这一难题。只需分享您的相关项目,他们便会为您处理其余一切。不要错过这个绝佳机会,让您的科技创意更上一层楼!
PCB组装工艺 - VGA驱动
我们首先使用焊膏涂覆针将焊膏逐个添加到每个元件的焊盘上,以开始PCB组装过程。此处使用的焊膏为63/37 SnPb焊膏。
然后我们将每个SMD元件挑选并放置到正确的位置。
随后,PCB被放置在回流焊加热板上,从底部开始加热至焊膏熔化温度。一旦PCB达到该温度,焊膏便会融化,所有元件便能牢固地固定在各自位置上。
对于通孔组装工艺,我们先将D-Sub 15连接器安装到位,然后接上枪形直流插孔,并用两个CON20母头引脚取代Pico。接着翻转电路板,使用焊锡笔对所有通孔元件的引线进行焊接,确保所有部件固定到位。
最后,我们将Pico W放置在母头针上方的位置。至此,驱动板的组装过程完成。
VGA 驱动程序演示
要运行我们VGA板上的DEMO CODE,需将显示器的VGA线插入电路的VGA接口,然后通过直流圆柱形插头连接电源适配器。
这是我们用于演示的代码,很简单。
代码首先定义了屏幕分辨率,如下所示。
接下来我们定义每个单元格的网格尺寸。每个单元格为8x8像素,因此网格共有640/8=80列和480/8=60行。
以下是模拟的缓冲区或核心部分,可防止在计算过程中覆盖数据。
接下来是绘制单元格逻辑。这一步首先将网格位置转换为屏幕像素。
用这个画出一个正方形。
这是一个随机函数,当代码开始时会随机填充网格。
这是生命游戏的核心逻辑,即计算邻居。它会检查周围的所有8个细胞。
游戏规则如下设定。
如果周围有2个或3个邻居,活细胞会存活;如果周围恰好有3个邻居,死细胞会复活。
使用下方的区域,我们仅重新绘制已更改的单元格,而无需进行全屏重绘。
这是从当前帧中下一个要移动的复制状态。
在设置中,VGA 被初始化,添加了随机性,模拟开始。
在循环中,模拟会持续更新,并且其速度受到控制。延迟越低,进化越快;延迟越高,则进化越慢,更易于观察。
PCB组装工艺-按钮板
按钮板组装首先在SMD LED和电容焊盘上涂覆焊锡膏。
然后使用防静电镊子将所有SMD元件放置到正确位置,包括六个100 nF的去耦电容和六个WS2812B RGB LED。
整个电路板随后被放置在回流焊加热板上,从底部开始加热至焊膏熔化温度。当PCB达到该温度时,焊膏开始熔化,所有SMD元件均被牢固地焊接到位。
我们在指定位置放置了12×12毫米的按钮。
安装好通孔开关后,我们翻转电路板,并用焊锡枪对每个引脚进行焊接。
这完成了按钮板的组装过程。
主电子设备设置
对于我们的电路主线路,我们首先将VGA板的GND与按钮板的GND连接起来,使两个PCB板共享一个公共地线。
按钮连接方式如下:
•火按钮为GPIO0
•UP 按钮连接到 GPIO1
•导弹按钮连接至GPIO2
•左键转为GPIO3
•DOWN 按钮连接至 GPIO4
•RIGHT 按钮连接至 GPIO5
对于RGB灯光设置,WS2812B LED的DIN引脚连接到GPIO6,而其VCC引脚则连接到树莓派Pico的5V输出。
所有线路连接均使用单芯银铜线,并配合焊锡枪将每个接头牢固焊接固定。
游戏代码
这是我们项目的主代码,包含游戏逻辑和功能。
代码很长,但核心功能非常简单。让我来解释一下。
我们在代码中使用了上述库。VGA图形库用于生成VGA视频输出,而硬件库则用于PWM音频、GPIO按钮输入、时钟处理和同步。
此处我们定义了VGA屏幕分辨率。我们的设置运行在640×480的分辨率下。
四个按钮用于方向控制,其余两个则用于发射子弹和导弹。
我们定义了在游戏过程中用于照明效果的RGB LED灯带。当敌人被消灭或发生特殊事件时,LED灯会亮起。
游戏分为多个状态,包括开场画面、剧情介绍、游戏玩法和游戏结束画面。
我还添加了一个带有完整游戏剧情序列的启动画面。在开始游戏前,游戏会以动画打字机风格的文字展示一段电影般的开场故事。
此功能将显示游戏的主启动画面,包含“PICO VGA BLASTER”标题和动态背景星星。
此功能为 lore lore 屏幕创建打字机动画效果,文字会逐个出现并伴有音效。
此函数将初始化所有按钮的GPIO引脚,并启用内部上拉电阻,以便Pico能够正确检测按钮按下事件。
这是主玩家控制功能,用于读取方向键输入,并更新飞船的移动和攻击行为。
这部分负责飞船的水平移动。
按下火键时,会发射一枚子弹。
这将显示游戏的HUD,包括得分、生命值、导弹弹药和Boss血量条。
此功能会显示最终的游戏结束画面,包含玩家的得分以及重新开始动画。
3D设计
在本项目的设计中,我的目标是设计一个能够同时容纳PICO VGA板和按钮板的外壳。VGA接口和电源DC插孔需要从一端保持可见,以便方便地接入VGA线缆和电源输入。此外,我还希望设备配备大尺寸按钮,以确保使用舒适且操作简便。
外壳设计本身保持了极简风格,但为了提升美观性,方向按钮被设计成根据D-pad方向旋转的三角形。火控和导弹按钮则分别采用圆形和方形造型。
为了进一步提升外观,我添加了四个格里布元素:O形、加号和X形部件,以及一个独立的部件,上面印有传奇的科乐美代码:“Up Up Down Down Left Right Left Right B A Start”。
我的想法是将主体外壳印成橙色,其余部分使用黑色PLA材料,从而在最终设计中呈现出双色调的视觉效果。
围栏设计
对于外壳,我们设计了两个部分:主体和盖板。所有组件,包括PICO VGA板、按钮板、开关以及格里布部件,均安装在主壳体内。
开关三角形位于外壳内部,当按钮PCB安装在它们上方后会固定到位,使所有部件保持牢固的定位。当按下这些开关三角形时,它们会激活按钮板上的开关,Pico便能检测到按键操作并执行相应的功能。
VGA板也安装在机壳内部的专用螺柱上,可通过M2螺丝固定。同样,按钮板也通过M2螺丝安装在螺柱上以进行固定。
从背面设计了一个独立的盖板部件,用于封闭外壳。我们在两侧各添加了四个安装孔,使用四颗M2螺钉将外壳与盖板牢固连接。
GREEBLES
部分细节部件也经过了设计优化,以提升整体外观的美感。我设计了规则形状的O型、加号和X型符号,并将其添加到外壳的正面。甚至专门制作了凹槽,使这三个部件能够精准地嵌入到位。
接下来,为了给玩家一个彩蛋,我加入了传奇的科乐美代码。我设计了一个独立部件,呈现了“上”、“下”、“左”、“右”、“A”、“B”和“开始”键的实体形状,并将其略微放置在方块按钮的上方。
3D打印零件
对于3D打印部分,外壳是唯一使用橙色Hyper PLA材料打印的部件,采用0.4mm喷嘴、0.16mm层高和25%填充率。我将零件倒置打印,从而避免了使用任何支撑材料。
使用相同的打印设置,但采用黑色Hyper PLA材料,我先单独打印了盖子部分,然后将所有小图案部件一起打印。
开关部件是单独打印的,因为它们需要支撑材料,我使用了木制支撑。
围栏组件
从外壳内部开始,将所有开关安装到位。
在开关上方,我们将按钮板对准其安装孔与外壳螺钉凸起部分进行定位。
同样,我们也将VGA板安装到其专用的螺丝座上。
整个装配过程中使用了M2螺丝,其中两个用于固定按钮板,三个用于固定VGA板。
最后,我们将盖子从底部安装,并用四颗M2螺丝将盖子永久固定在壳体上。
GREEBLES装配
我们先在安装位置上涂上强力胶,然后将O形部件放置到位。
同样地,我们对Plus和X的锯齿部分也采用了相同的方法:先在安装点上涂上强力胶,然后再将每个部件定位。
最后,我们通过在部件背面涂抹强力胶,并将其略微置于方形开关上方,完成了科乐美代码部分的安装。
结果
这是本次制作的最终成果:PICO VGA BLASTER,一款复古风格的游戏主机,运行着我定制开发的游戏。
要使用此控制台,我们需要将其连接到VGA显示器。在此情况下,我们使用的是支持VGA接口的普通LED显示器,并通过DC插孔连接12V电源适配器为设备供电。
游戏机运行着我自创的《太空侵略者》版本,敌人被设计成类似VGA端口的外观。通过方向键,我们可以操控飞船,攻击方式有两种:普通射击模式和导弹发射器。击败一支敌群后,将进入Boss战斗,接着是另一支敌群,此时VGA敌人可以对玩家进行反击。之后是第二波Boss战斗,难度是前者的两倍。如果三名玩家的生命值全部耗尽,游戏将触发结束画面。
本文编译自hackster.io





