04-29-2024, 04:53 AM
https://github.com/henning2323/IR_LightGun
方案搜集来自BIDI朋友
IR_光枪
介绍
两年前的假期,我第一次在街机(世嘉的兰博街机)玩光枪游戏,我很惊讶!我总是想象虚拟射击只是击中你瞄准的大致方向的某个地方,并且游戏玩法或多或少是喷射和祈祷。但令我惊讶的是,游戏玩法快速、敏捷且可控。我一回到家就想拥有这样的东西。但在检查了此类机器的价格(当然还有实用性)后,我很快决定在我的 PC 上使用模拟器。由于市场上没有合适的选择,而我恰好学习电气工程,因此我寻找 DIY 选项。
一个广泛的选择(或者至少与光枪 DIY 社区一样广泛)是与 Wii 的传感器条配对的红外摄像头模块(当然现在多了一个悟空学堂MOT700的模组)。通过 YouTube 上一个名为“SAMCO”的频道的视频系列,我启动并运行了我的第一个版本。通过此设置,您需要校准光枪,以便它知道屏幕相对于 Wii 传感器条的位置,相机可以跟踪该位置。对我来说,问题是这种校准很乏味、不一致,而且只要稍微移动一点就必须进行校准。你总是必须将瞄准调整几厘米,因为子弹不会准确地落在你瞄准的地方。此外,输入延迟太高,因此镜头感觉像是沿着您所指向的方向进行的。
一年后,我坐下来开发了自己的代码,具有以下功能:
特征:
无需校准
无需计算机上的任何软件,光枪只需作为即插即用的 USB 设备即可使用
几乎完美的准确性,因此您甚至可以在节奏较慢的游戏中关闭游戏十字准线
极端视角
减少输入延迟
零件清单:
Arduino Pro Micro 5V/16Mhz(约 5 欧元) 使用ESP32C3或者esp32s3进行替换
Pro Micro有两个版本,具有不同的电压和运行速度(3.3V/8MHz和5V/16Mhz)。我建议使用 5V 版本,因为它速度更快并且延迟更少,但两者都应该可以工作。
红外定位相机(20 - 25 欧元) 使用悟空学堂的mot700模组进行替换
我从 DFRobot 那里得到了这个,但我想我在多个网站上看到了同一个。它在内部完成所有繁重的工作(图像处理),并通过 I2C 直接提供最多 4 个跟踪红外源的坐标。在我的情况下,它也非常适合我使用的损坏的 nerf 枪的末端。
USB 线 如果使用esp32会增加一个无线的版本
相机需要看到整个屏幕,因此您必须与屏幕保持最小距离。如果是 22 英寸屏幕,则约为 2 米。距离与显示器尺寸成线性关系,因此请选择适合您屏幕的电缆长度。
一些按钮
任何形式的简单按钮(按钮在按下时连接端子/如果未按下→无连接)都可以在这里工作。稍后可以将它们映射到鼠标按钮和键盘按键。在我的nerf枪中,我可以使用已经存在的开关。我可以使用扳机,即第二个小扳机,插入弹匣并将盖子滑回顶部。
LED + 匹配电阻(可选)
在其中一款光枪中,我在前面的面板下方安装了一个明亮的白色/蓝色 LED,当扣动扳机时,该 LED 会闪烁。你在玩的时候不会注意到它,但是对于每个观看的人来说它看起来都很酷。如果您想保证 LED 保持亮灯时间超过一秒,您还需要一个电阻。为了计算其电阻值,您需要 LED 的正向电压和推荐/最大正向电流。我还添加了一个 LED,当光枪没有看到所有 4 个红外源时,它会亮起,但我从未看过它。我只记得它还在那里,因为我现在再次阅读了我的代码。
4 个小型红外源 wii摄像头是940nm,悟空学堂MOT700是850nm波段
这些红外源需要放置在屏幕的角落。我使用的是从之前用过的 Wii 传感器棒中回收的 IR LED,但任何东西都可以。
良好的亮度和大的视角是理想的。多个彼此靠近的 LED 将被传感器拾取为一个光源,这非常有帮助。理论上,即使在屏幕四角放置 4 根小火焰蜡烛也可以,但我认为这不是最实用的解决方案。顺便说一下,您可以通过手机的摄像头查看红外 LED 灯是否开启及其亮度。您可以通过按下按钮时观看遥控器 LED 闪烁来进行尝试。
接线
接线非常简单。红外摄像头需要使用 3.3V 或 5V 供电,并且其两条通信线需要连接到微控制器的 I2C 引脚。MOT700为SPI接口
此图显示了相机的连接方式(左侧 4 根电线)以及按钮和 LED 的示例。
micro.jpg (大小: 17.58 KB / 下载: 10)
代码
在代码中,有两个部分需要编辑。首先,在第 8 行到第 13 行中,您需要将数字更改为连接按钮或 LED 的数字。
#define triggerA 2
#define triggerB 3
#define mag 9
#define lid 8
#define fireLED 4
#define warningLED 15
请注意,我使用名为 2 和 3 的引脚作为触发按钮,但它们与板上的 2 和 3 不对应,因为这些引脚已被 I2C 接口使用。
需要注意的第二部分是从第 67 行开始的函数“handleButtons()”。在这里,您需要告诉代码当您按下光枪上的任何按钮时应该按下哪个鼠标按钮或按键。只需更改它所说的两行即可
AbsMouse.press(MOUSE_MIDDLE);
或者
Keyboard.press(KEY_RETURN);
如果您想使用我使用的相同按钮,您当然可以保留此部分不变。
之后,您的代码应该准备就绪。
光枪现在应该可以工作,但由于红外摄像头和您使用的瞄准器之间有一定距离,因此鼠标/十字准线可能没有完全居中。要正确地将其“归零”,您可以通过一些步骤调整第 39 行和第 40 行中的值,直到鼠标位于正确位置。
int gunCenterX = 595;
int gunCenterY = 325; 考虑更改定位模式或者利用wifi server模式进行模块的无线修改
使用光枪
只需打开您的红外源,插入光枪的 USB 电缆,您就可以开始使用了。尤其是可以接受原始鼠标输入并在 Windows 上运行的游戏非常棒!对于所有模拟器,您只需使用常用的工具/插件,例如 nuvee 或 demulshooter,如果您使用鼠标玩游戏,您也需要这些工具/插件。由于这些插件会中断设备的信号,因此您可以毫无问题地使用多个此类光枪。
我想说链条中最薄弱的环节是您的红外光源。大多数 IR LED 具有很强的方向性,大约 45° 后就看不到了。这也是 Wii 传感器条将三个不同角度的 LED 并排放置的原因。我提高性能的廉价解决方案是,我将传感器条上的三个 LED 之一短路,而其他 LED 现在运行电流过大。这意味着它们非常明亮,但它们会变得非常温暖,并且可能不会正常使用超过几年。我还听说,如果您发现自己遇到跟踪问题,将 LED 的尖端磨平可以产生奇迹。它充当漫射器,光线从多个方向离开。如果您发现任何已经扩散的红外灯泡可能是最好的,但我从来不需要从我的廉价解决方案进行升级,该解决方案工作完美。
未来的升级
有两件事我有时仍想补充。第一个是带有 DPad 或模拟摇杆的前手柄,适用于少数可以使用方向输入的游戏。我想使用连接到底部导轨的可拆卸手柄来完成此操作,或者直接将其安装到 nerf 冲击波上。前面用来放置大电池的隔间完全是空的,而这也是我通常放置双手的地方。
第二个添加是代码中的一些更改,也许是红外设置中的一些更改,这样即使光枪距离屏幕太远,它也看不到所有四个红外标记,它也知道它指向哪里。结果是,如果您愿意,您可以离屏幕更近。但我还不确定是否有一种可靠的方法可以实现这一目标,而不会影响准确性或需要更复杂的传感器。
我希望您发现这很有用,并且能够让一切为您工作。如果您对其工作原理有任何疑问或需要设置帮助,请随时询问。
方案搜集来自BIDI朋友
IR_光枪
介绍
两年前的假期,我第一次在街机(世嘉的兰博街机)玩光枪游戏,我很惊讶!我总是想象虚拟射击只是击中你瞄准的大致方向的某个地方,并且游戏玩法或多或少是喷射和祈祷。但令我惊讶的是,游戏玩法快速、敏捷且可控。我一回到家就想拥有这样的东西。但在检查了此类机器的价格(当然还有实用性)后,我很快决定在我的 PC 上使用模拟器。由于市场上没有合适的选择,而我恰好学习电气工程,因此我寻找 DIY 选项。
一个广泛的选择(或者至少与光枪 DIY 社区一样广泛)是与 Wii 的传感器条配对的红外摄像头模块(当然现在多了一个悟空学堂MOT700的模组)。通过 YouTube 上一个名为“SAMCO”的频道的视频系列,我启动并运行了我的第一个版本。通过此设置,您需要校准光枪,以便它知道屏幕相对于 Wii 传感器条的位置,相机可以跟踪该位置。对我来说,问题是这种校准很乏味、不一致,而且只要稍微移动一点就必须进行校准。你总是必须将瞄准调整几厘米,因为子弹不会准确地落在你瞄准的地方。此外,输入延迟太高,因此镜头感觉像是沿着您所指向的方向进行的。
一年后,我坐下来开发了自己的代码,具有以下功能:
特征:
无需校准
无需计算机上的任何软件,光枪只需作为即插即用的 USB 设备即可使用
几乎完美的准确性,因此您甚至可以在节奏较慢的游戏中关闭游戏十字准线
极端视角
减少输入延迟
零件清单:
Arduino Pro Micro 5V/16Mhz(约 5 欧元) 使用ESP32C3或者esp32s3进行替换
Pro Micro有两个版本,具有不同的电压和运行速度(3.3V/8MHz和5V/16Mhz)。我建议使用 5V 版本,因为它速度更快并且延迟更少,但两者都应该可以工作。
红外定位相机(20 - 25 欧元) 使用悟空学堂的mot700模组进行替换
我从 DFRobot 那里得到了这个,但我想我在多个网站上看到了同一个。它在内部完成所有繁重的工作(图像处理),并通过 I2C 直接提供最多 4 个跟踪红外源的坐标。在我的情况下,它也非常适合我使用的损坏的 nerf 枪的末端。
USB 线 如果使用esp32会增加一个无线的版本
相机需要看到整个屏幕,因此您必须与屏幕保持最小距离。如果是 22 英寸屏幕,则约为 2 米。距离与显示器尺寸成线性关系,因此请选择适合您屏幕的电缆长度。
一些按钮
任何形式的简单按钮(按钮在按下时连接端子/如果未按下→无连接)都可以在这里工作。稍后可以将它们映射到鼠标按钮和键盘按键。在我的nerf枪中,我可以使用已经存在的开关。我可以使用扳机,即第二个小扳机,插入弹匣并将盖子滑回顶部。
LED + 匹配电阻(可选)
在其中一款光枪中,我在前面的面板下方安装了一个明亮的白色/蓝色 LED,当扣动扳机时,该 LED 会闪烁。你在玩的时候不会注意到它,但是对于每个观看的人来说它看起来都很酷。如果您想保证 LED 保持亮灯时间超过一秒,您还需要一个电阻。为了计算其电阻值,您需要 LED 的正向电压和推荐/最大正向电流。我还添加了一个 LED,当光枪没有看到所有 4 个红外源时,它会亮起,但我从未看过它。我只记得它还在那里,因为我现在再次阅读了我的代码。
4 个小型红外源 wii摄像头是940nm,悟空学堂MOT700是850nm波段
这些红外源需要放置在屏幕的角落。我使用的是从之前用过的 Wii 传感器棒中回收的 IR LED,但任何东西都可以。
良好的亮度和大的视角是理想的。多个彼此靠近的 LED 将被传感器拾取为一个光源,这非常有帮助。理论上,即使在屏幕四角放置 4 根小火焰蜡烛也可以,但我认为这不是最实用的解决方案。顺便说一下,您可以通过手机的摄像头查看红外 LED 灯是否开启及其亮度。您可以通过按下按钮时观看遥控器 LED 闪烁来进行尝试。
接线
接线非常简单。红外摄像头需要使用 3.3V 或 5V 供电,并且其两条通信线需要连接到微控制器的 I2C 引脚。MOT700为SPI接口
此图显示了相机的连接方式(左侧 4 根电线)以及按钮和 LED 的示例。
micro.jpg (大小: 17.58 KB / 下载: 10)
代码
在代码中,有两个部分需要编辑。首先,在第 8 行到第 13 行中,您需要将数字更改为连接按钮或 LED 的数字。
#define triggerA 2
#define triggerB 3
#define mag 9
#define lid 8
#define fireLED 4
#define warningLED 15
请注意,我使用名为 2 和 3 的引脚作为触发按钮,但它们与板上的 2 和 3 不对应,因为这些引脚已被 I2C 接口使用。
需要注意的第二部分是从第 67 行开始的函数“handleButtons()”。在这里,您需要告诉代码当您按下光枪上的任何按钮时应该按下哪个鼠标按钮或按键。只需更改它所说的两行即可
AbsMouse.press(MOUSE_MIDDLE);
或者
Keyboard.press(KEY_RETURN);
如果您想使用我使用的相同按钮,您当然可以保留此部分不变。
之后,您的代码应该准备就绪。
光枪现在应该可以工作,但由于红外摄像头和您使用的瞄准器之间有一定距离,因此鼠标/十字准线可能没有完全居中。要正确地将其“归零”,您可以通过一些步骤调整第 39 行和第 40 行中的值,直到鼠标位于正确位置。
int gunCenterX = 595;
int gunCenterY = 325; 考虑更改定位模式或者利用wifi server模式进行模块的无线修改
使用光枪
只需打开您的红外源,插入光枪的 USB 电缆,您就可以开始使用了。尤其是可以接受原始鼠标输入并在 Windows 上运行的游戏非常棒!对于所有模拟器,您只需使用常用的工具/插件,例如 nuvee 或 demulshooter,如果您使用鼠标玩游戏,您也需要这些工具/插件。由于这些插件会中断设备的信号,因此您可以毫无问题地使用多个此类光枪。
我想说链条中最薄弱的环节是您的红外光源。大多数 IR LED 具有很强的方向性,大约 45° 后就看不到了。这也是 Wii 传感器条将三个不同角度的 LED 并排放置的原因。我提高性能的廉价解决方案是,我将传感器条上的三个 LED 之一短路,而其他 LED 现在运行电流过大。这意味着它们非常明亮,但它们会变得非常温暖,并且可能不会正常使用超过几年。我还听说,如果您发现自己遇到跟踪问题,将 LED 的尖端磨平可以产生奇迹。它充当漫射器,光线从多个方向离开。如果您发现任何已经扩散的红外灯泡可能是最好的,但我从来不需要从我的廉价解决方案进行升级,该解决方案工作完美。
未来的升级
有两件事我有时仍想补充。第一个是带有 DPad 或模拟摇杆的前手柄,适用于少数可以使用方向输入的游戏。我想使用连接到底部导轨的可拆卸手柄来完成此操作,或者直接将其安装到 nerf 冲击波上。前面用来放置大电池的隔间完全是空的,而这也是我通常放置双手的地方。
第二个添加是代码中的一些更改,也许是红外设置中的一些更改,这样即使光枪距离屏幕太远,它也看不到所有四个红外标记,它也知道它指向哪里。结果是,如果您愿意,您可以离屏幕更近。但我还不确定是否有一种可靠的方法可以实现这一目标,而不会影响准确性或需要更复杂的传感器。
我希望您发现这很有用,并且能够让一切为您工作。如果您对其工作原理有任何疑问或需要设置帮助,请随时询问。
悟空学堂 专注交互技术分享