我正在开发一个能够玩各种视频游戏机(真实硬件,不是模拟的)的街机柜。里面会有一台 PC 来运行选择菜单。我得自己写。我还需要编写一个 PLC 程序,它可以执行各种操作,例如控制在 PC 和各种控制台之间切换音频/视频/控制的继电器等。我需要及时帮助完成这两项任务,但他们不是我现在正在做什么。
我作为起点所做的工作与控制器编码有关。基本上,每个玩家的控件由几个按钮和一个操纵杆组成。它们使用瞬时常开触点开关,每个按钮一个,操纵杆上的每个基本方向一个。按下按钮或操纵杆方向,关闭开关。然后通过编码器将按钮的状态传送到控制台。
编码器的每个按钮和操纵杆方向都有一个连接,通过一个上拉电阻连接到 5 伏(“高”)。当按下按钮或方向时,通过瞬时开关进行接地连接。当编码器在按钮连接上读取接地(“低”)时,它知道按钮已被按下,并将其传达给控制台。
我已经在各种控制台上完成了所有这些工作,但我想到了一些可以很好添加的功能。这就是我当前的任务所在。
第一个功能是按钮重新映射。其中一些游戏在设计时考虑了控制器,因此当您将它们与街机控制面板一起使用时,某些按钮可能不在您想要的位置。有些游戏允许通过软件重新映射按钮,但有些则不允许。我的想法是在操纵杆和按钮与编码器之间添加一个 PLC。我将此 PLC 称为“预编码器”。
预编码器会读取一些输入引脚上的按钮状态,然后将这些状态写回一些输出引脚,将它们中继到编码器。优点是它的编程可以将任何输入引脚与任何输出引脚相关联,从而有效地重新映射按钮。每当通过计算机的菜单选择控制台时,也可以选择与特定游戏相关的按钮映射配置文件,并将其转发到预编码器。
当然,读取按钮并将它们的状态传递给编码器的预编码器例程必须非常快速地重复以实现平滑控制。这些游戏将以大约 50 到 60Hz 的频率运行,这意味着每 16.67 毫秒或更短的时间会有一个新的视频帧。理想情况下,预编码器将能够每帧多次重复此例程,以确保绝对最小输入延迟。我想确保优化代码和硬件选择以尽可能快地运行。
第二个功能是涡轮按钮。有些游戏,尤其是街机游戏,即使你有无限的弹药,每次你想开火,或者你的船的大炮等时,都需要反复按下开火按钮。这似乎没有必要,它会让你的手指很快筋疲力尽。涡轮按钮是可以连续按住的按钮,但游戏会被告知您正在快速按下和释放它。这可以在 PC 上运行的任何东西的软件中完成,或者使用 555 计时器等模拟解决方案来完成,但最好的方法是将涡轮按钮计时与视频刷新率同步。通过将来自 PC 或视频游戏控制台的视频输出的垂直同步脉冲馈送到 PLC,它将准确地知道一帧视频的渲染频率。然后可以通过定义来控制 Turbo 按钮时间,在帧数中,应按下和释放按钮的时间段。计时信息也可以包含在游戏特定的按钮配置文件中。
第三个特点是慢速按钮。实际上,这可能仅适用于操纵杆,但我将其主要方向的开关称为按钮。在某些游戏中(它可能只用于 shmups),有时需要将您的角色(船/飞机)移动通过非常狭窄的空间。如果响应即使是最小的操纵杆输入,移动也太快,您可能会走得太远而崩溃。这个想法是,当按住一个慢速激活按钮时,操纵杆将通过以与涡轮按钮相同的方式快速激活和停用它而降低响应。
我不确定我是否希望预编码器本身观察垂直同步脉冲,或者它是否会减慢它的速度。我目前的想法是单独的 PLC 将负责驾驶室本身的一般管理;观察“on”按钮、切换继电器、直接与 PC 通信、观察垂直同步脉冲等。这将释放预编码器以更快地运行。
这是预编码器的一些示例“代码”。显然,这只是我脑海中的粗略轮廓,因为我什至不知道它会是什么语言。此示例假定专用 PLC 将用作预编码器。除了其他任务,例如从计算机获取游戏配置文件并将其中一些信息传递给预编码器,一个单独的 PLC 将负责观察垂直同步脉冲。该 PLC 将知道 turbo 和慢速功能的帧时序应该是多少,它会计算帧数,并且在应该禁用 turbo 按钮的帧期间,它会向预编码器 PCB 上的引脚输出高电平,让它知道禁用 turbo纽扣。在应该启用它的帧期间,它向该引脚输出低电平。与慢速按钮相同的想法。
get info from other PLC (which got it from the computer, from a user-selected game profile):
array containing list of turbo buttons (buttons are identified by what input pin they are connected to)
array containing list of slow buttons (will probably only be the joystick directions, if any)
array containing list of slow activation buttons (should normally be only one button, if any)
array containing list of normal buttons (not turbo or slow)
array containing which output pin to use for each button (this determines remapping)
Begin Loop
if turbo pin is high
for each turbo button
output pin = high
next
else
for each turbo button
output pin = input pin
next
end if
if slow pin is high and slow activation button is pressed
for each slow button
output pin = high
next
else
for each slow button
output pin = input pin
next
end if
for each normal button
output pin = input pin
next
Restart Loop unless stop pin is low
如果您已阅读所有这些内容,感谢您抽出宝贵时间。所以(最后),这是我的问题:
你的总体想法是什么?关于我的总体想法,可行性等?
我应该为预编码器使用哪种 PLC?我最初想尝试一个 Arduino,但我的阅读表明它太慢了,因为它使用了高级编程库。我在另一个 PLC 周围构建自己的电路板没有问题。
我应该使用什么语言对 PLC 进行编程?我不介意学习一门新语言。这个项目没有时间限制,我会尽一切努力让预编码器尽可能快地运行。
将我的程序闪存到 PLC 上需要什么?
在运行时,这些 PLC 应该如何相互通信,以及如何与 PC 通信?
我在正确的地方问吗?正确的论坛,正确的部分等?还有什么地方我应该问?
热切期待您的回复,
-抢