Arduino自动弹球机

2020-05-22 00:07:43

我听到你在问,一台能自动玩的弹球机不会让它失去所有的乐趣吗?如果你不喜欢自主机器人,也许你会喜欢。然而,我很大程度上致力于制造能够做很酷的事情的机器人,而这个机器人做了一些相当酷的事情。

这个项目是作为肯纳索州立大学的高级设计项目建造的,是我儿时梦想成真的建筑。

这些功能包括一个跟踪你得到多少分的工作计分系统,一个多球Plinko机器,以及前面的一个自动激活开关,你可以在飞行中翻转。上面安装了一个USB摄像头,它在游戏过程中不断检测鳍状肢的位置和弹球的位置,并根据它们的相对差异做出决定。这里有更多该项目的图片!

虽然你可能不能(或者甚至不想)准确地重建这个项目,但我希望这能给你灵感,或者给你一个起点,让你制作出令人惊叹的东西。

显然,这个项目涉及到大量的物资,我不认为我能列出每一件物品,也不认为它会有什么用处。然而,我确实想提供一个主要的弹球组件,和工具,需要建立这个项目的清单。在后面的部分中,我将尝试为特定组件提供更详细的列表。

老师!你在教室里用过这个指示器吗?添加教师备注以分享您是如何将其整合到课程中的。

构建任何东西的第一步是对事物的各个部分如何协同工作做一些简单的研究。我想你至少会对电子元件略知一二,但即使你不懂,我也希望这对你有帮助。

要获得有关弹球机的一般帮助,这些链接应该会为您提供很好的理解。

本节有指向不同算法和项目的链接,这些算法和项目在实现自治时可能会很有帮助。

所以一开始这似乎是一项更简单的任务,如果你已经考虑了很长一段时间,也许的确如此。然而,由于这样或那样的原因,这可能是一件相当困难的事情。

你可能有一开始没有考虑到的空间限制,或者可能你正在考虑的一些击球对于你的鳍状肢来说是不可能击中的。在你出去把时间和金钱花在一个不起作用的设计上之前,所有这些事情都需要在你的脑海里和纸上做好准备。

对于我们的团队来说,我们在真正穿过并铣削出最后的操场之前,用非常便宜的胶合板把它分成了几块测试板。我们还经历了大量的设计迭代,不断地改变机器的外观,但我们采取的每一步都让我们离最终产品更近了一步。

在移动到3D建模之前,在纸(或白板或其他任何东西)上绘制。为铣削过程中的错误做好计划,具有可以取出并放回的模块化特征。不要重新发明轮子,看看流行的游戏以及它们是如何构建游乐场的。你脑海中的梦想不会完全是最终出现在你面前的,而是带着那里的东西,带着它奔跑。

这一部分显然完全取决于你,但我将介绍我们在制造机器时所做的一些挑战和事情。

正如前面提到的,我们在solidworks中为这个项目设计了我们的所有部件,所以您可以在这里随意使用我们的模型-https://github.com/Tdoe4321/AutoPinball/tree/master/CAD_Models。

自动弹珠机的机械设计包括两个主要的子集,运动场本身和看台。操场是标准尺寸--20.25“x 42.00”--由3/4英寸的波罗的海桦木胶合板制成,这是最终设计的首选材料。第一个主要的设计考虑因素包括COTS组件在运动场上的定位,以及自定义设计的边界。在这个解释中,“组件”是指球在其中相互作用的任何带电或非带电的COTS部件,而“边界”构成可能改变球轨迹的静态定制木材或丙烯酸表面。当球穿过运动场时,组件和边界被定位为提供球的最大机动性,边界将球定向到所需组件。通常,这些区域的构造使得球可以从任何一个区域横向到任何其他相邻区域,几乎没有阻抗,取决于接近角度和速度。例如,球可以从“L进/出通道”区域的左鳍板发射,并进入任何其他区域,包括发射通道以外的任何区域。如果球进入“坡道和Y车道”,它可能会围绕轨道逆时针移动到“中心车道”,与弹出式保险杠相互作用并被弹出到中心车道,或者通过“L轨道和Y车道”完成轨道运行,然后返回到左鳍板。

运动场包括由2英寸直径的丙烯酸管材和3D打印适配器组合而成的第二层。第二个层次有两个主要功能。首先,第二层作为一种媒介,将球从上层球场直接传送到左鳍内线。球的最终存放位置的可预测性使第二级成为促进多球的一致途径,这是它的第二个主要功能。当坡道和左内车道上的翻转开关背靠背被触发时,伺服装置沿着Plinko机器释放两个球,这些球被存放在安装在第二层以上的两个管中的一个中,以消除与坡道击球的冲突。因此,在多球模式期间,管子供给第二级,并因此供给左侧内道。

选择3英寸胶合板厚度是为了给项目提供足够的刚性,并允许在承重接头中有更大的紧固件接合。口袋孔几何是木工中常见的对接的另一种方法,在这种方法中,木材的两个端件以直角连接在一起。口袋连接通过一个侧面到另一个侧面创建了一个15度的孔,在没有使用端面的情况下产生了强度更高的接头。虽然1/2英寸厚的木头允许打孔,但对于1/4英寸厚的木头来说,这种孔是最常见和有效的,而1/4“厚木头所需的1/4英寸的中袋螺丝则更为常见。波罗的海桦树被选为材料类型,因为它质量高,结和杂质很少,是一种硬木,因此是刚性和抗损坏的,对激光友好(用于雕刻),通常是木工的首选,用于较重的项目。

选择3/4英寸厚胶合板有两个主要后果。首先,大多数四级激光器的额定功率不超过150W,这本身就不足以切割这种厚度的硬木。因此,该项目必须用五轴机床进行数控加工。第二个结果是COTS弹球组件,如螺线管、翻转开关、LED、站立靶板等,都是为1/2英寸面板安装而设计的。因此,运动场需要从底面进行CNC加工,并为组件端铣1/4“凹槽。对精确安装特征和凹槽的要求为项目增加了另一层精度,这可以通过为每个组件生成高精度的CAD模型来解决。

支架用作运动场的安装设备,并容纳定制的电子产品。电子产品直接安装在底板上,延长的线束可以到达操场的下侧。从展台的侧面可以通过观察窗看到电子产品。此外,支架允许通过侧面可拆卸的销对运动场进行可变间距调整。从零度开始,每个2度增量处都包含孔,最大斜度为8度。运动场梯度越高,游戏节奏越快,难度也越大。

虽然看台和操场的铣削不需要CNC或激光,但强烈建议您在为项目切割木材时使用数控或激光。手工完成是非常困难的,而且远没有你想要的最终产品那样精确。

我们有一个大型的5轴数控系统,这就是现在几乎所有的专业游戏都是这样制作的。如果你不能在CNC上铣削它,别担心!我们的许多部件必须在事后进行调整,用一些木质腻子来掩盖任何错误是相当容易的。

一旦你的操场被碾平,你的部件都被订购好了,就是时候把所有的部件放在一起了。我们用口袋孔的方法把我们所有的主要支架固定在一起以备机器使用。

至于安装硬件,你真的只需要一个不到1/2英寸长的螺丝来安装组件。我们主要使用4号木螺钉。

重要的是要认识到,在这里,一些组件将被安装到看台上,而另一些组件将被安装到运动场本身。鳍状按钮、电源、电路板等都将直接安装在展台上,而主要的弹球部件将安装在操场上。

很明显,弹球机需要电力,如果没有它,它怎么能打开所有那些花哨的灯和翻转脚蹼呢?

在将所有东西连接在一起之前,只需要考虑几个因素。

大多数弹球机高压在35V-48V的范围内,这取决于你购买的螺线管的制造,你会想要选择一个可以支持你的线圈的电源。其次,你需要考虑为灯或其他较小的电子部件供电的低压电源。我们选择了6.3伏的电压作为我们的低压,但这并不一定是板上钉钉的。这取决于你买了什么LED,你想要的亮度,以及你是否用这个电源给其他电器供电。对于简单的东西来说,6.3V应该可以很好地工作。

我们买的电源不包括低压电源,所以我们必须买一个单独的电路板来给我们的灯供电。这就是所谓的降压转换器。它承受高电压(如48V),然后将电压降至额定电压。大多数都是可调节的,就像这个!

虽然大多数元件都需要一定的电压才能正常工作,但电流是感应电流。这意味着,您供电的组件将根据它们的电阻吸收所需的电流。正因为如此,很难说你的机器需要支持多少电力。

100瓦可以吗?那么50呢?";这些都是在你脑海中盘旋的问题,答案是,这要视情况而定。如果您的组件没有达到正确的功耗额定值,那么东西可能很快就会被烧毁。当您意识到这些组件在很短的时间内拉出大量安培时,问题就出现了。当它们被发射时,鳍状肢会拉出一些疯狂的东西,比如3-4安培,其中两个大约是8安培。之所以能够发生这种情况,与线圈被驱动的时间长短有关。

我意识到这不是很有帮助,我对此表示歉意。我的建议是根据目前的抽签情况计算你的最坏情况,然后给出一个很好的安全系数。回答这个问题,如果所有的东西都同时打开,我们会消耗多少电流?一旦你有了这个问题的答案,你应该可以选择一个电源。

开关输入板负责将所有值从操场读入Arduino。实现这一点的单个电路非常简单,但需要针对大量输入进行放大。

由于Arduino有一个内部上拉电阻,如此处所述,您可以如上所述将其布线。这使得线路非常简单,因为你不需要有任何额外的电阻或电压暴露。在Arduino代码中,您需要告诉它使用INPUT_PULLUP,但这将在后面介绍。

这里最重要的事情是确保每个交换机都有连接器,以防出于某种原因需要取出其中一个。

我们使用标准引脚接头作为我们的连接器,这使得一次将所有东西插入Arduino变得非常容易。

此外,您可以考虑在操场开关周围添加一些电路,以延长它们从球开始与其交互的时间。您这样做的一个原因是如果Arduino检查开关太慢,并且错过了正在触发的开关。我们没有遇到这个问题,因为Arduino代码的所有主循环都是检查连接到它的所有开关。但是,如果你想阅读更多关于它的内容,请查看这篇论坛帖子。

控制灯光的基本电路也同样相当简单。该电路由BJT晶体管(2n2222)、几个电阻器和你想要激活的LED组成。我们使用晶体管作为数字开关,我们可以打开或关闭,就像这样!您还应该将其连接到前面提到的6.3V电源。这将提供漂亮的明亮光线和可单独寻址的LED。

你不能直接把LED连接到Arduino的原因是Arduino不能为那么多的灯提供足够的电流。它自己可以处理几个,但是当你把它扩大到弹球机的大小时,它需要一些周围的电路。

我们在这里要做的是使用Arduino作为数字开关,打开或关闭BJT,从而完成每个LED的电路。这使我们可以将LED的数量扩大到我们的电源可以处理的尽可能多的数量,而不会出现任何问题。

这里是电路变得有点复杂的地方,但需要创建的电路较少。这里的总体思路与LED板相同。我们希望能够从Arduino发出信号,能够打开/关闭任何电磁阀(鳍状肢、弹弓、弹出保险杠)。因为这些组件比LED需要更多的电力来驱动,所以我们需要一些更大的晶体管,MOSFET。

每个电磁阀都需要连接到48V才能执行。螺线管基本上只是一个绕在圆圈里的很长的导线,所以当电流通过它时,就会产生一个电场。这个领域移动一根金属棒,它可以弹出鳍状物,掉下一个弹出的保险杠,或者弹出一个弹弓。你可以在这里找到一段非常棒的视频!

另一个关于螺线管和电感器的快速说明。因为电感器不能瞬间改变电流,这给我们带来了一个问题。这些螺线管在激活时会推动大量电流通过它们,当我们告诉它关闭时,所有的电流都需要流向某个地方。它需要一个地方慢慢消散。如果你没有地方让水流流过,它就会试图强行穿过某个可能会损坏部件的地方,这是非常危险的。

为了补偿这一点,我们使用了RC缓冲电路和一些二极管。它们基本上都在做同样的事情--试图减缓电流的消散。如果您不包括至少其中之一(最好是两个),那么您肯定会损坏一些MOSFET。

现在,你可能注意到鳍状肢和其他线圈的电路略有不同。这是因为,在弹球比赛中,球员有时会想要按住鳍状物按钮,以使鳍状物长时间处于启动状态。如果您使用相同的高功率线圈将鳍状肢保持在直立位置,您会很快烧毁线圈。翻盖电路中的第二个线圈允许快速而有力的初始翻转。一旦翻转完成,机械过程就会打开EOS开关,迫使电流通过两个线圈。要查看更多有关鳍状物电路如何工作的信息,请查看此帖子。

根据您的游戏大小,焊接显然可能需要很长时间或很短一段时间。我们花了大约两天的时间把所有东西焊接和布线成整齐整齐的捆绑。实际上,我对它的组织方式真的很满意。

所有这些都插到了3D打印连接板上,它容纳了我们所有的电路材料。它还使我们在需要了解情况时诊断问题变得超级容易。你所要做的就是拔下5个大接头,然后抬起机器。

在这台机器上,我们需要在连接到Arduino的计算机上安装以下依赖项。

虽然我们现在谈论的是软件,但现在可能是一个很好的时机来对项目的不同部分进行一个很好的概述。大部分内容都与上面的图表有关,所以手边有它会很有帮助。

整个软件系统依赖ROS架构作为来回传递消息的后端。概述包括节点所依赖的类结构列表,以实现更结构化、更有组织的方法。

当弹球机在自主模式下运行时,四个主节点之间通过异步通信来控制弹球机的流量。这些节点是input_Output.ino、tracemetal.cpp、run_low_level.py和GUI.py。当不在自主模式下运行时,可以省略节点Track_metal.cpp。

input_Output.ino是上传到Arduino的脚本,它处理弹球组件的所有文字开关以及从任何操场开关读取。这些物品包括鳍片、保险杠、弹弓、灯、开关、站立目标、微调器、开始按钮和自动开/关开关。Input_Output.ino节点有两个主要功能:启用操场上的项目和将开关状态中继回计算机。这两个项目通过ROS主题完成。

track_metal.cpp节点负责实时定位球,以设定的增量定位翻转器,并决定何时翻转翻转器。此外,Track_metal.cpp节点从物理自主切换状态的Input_Output.ino节点接受单个输入,以了解何时应该翻转鳍状肢。

当鳍状肢向下且帧中没有球时,拍摄操场的照片。将该帧转换为灰度。使用二进制阈值将每个新帧与原始帧进行比较。这是可能的,因为每个帧都有定义它的单个像素颜色值。使用cv::diplate()放大在二进制比较中发现的异常。使用cv::findContours()从这个二进制比较中检索轮廓列表。循环遍历列表。位于某个阈值之间的任何轮廓区域都将被归类为球。

与试图检测图像中的圆圈相比,这种在操场上寻找弹球的方法既有优点也有缺点。这种方法的第一个主要优势是速度。经过初步测试,试图找到图像中的圆圈在系统中被证明有太多的延迟,弹球在高速下会移动得太快而无法被检测到。其次,当弹球高速移动时,它会出现在相机上,周围有大量的模糊。这可能会极大地影响圆的检测,因为形状不再显示为圆形。这样做的主要缺点是经常错误地将其他物体贴上弹球的标签。很多时候,当运动场上的灯亮了或其他东西移动时,它们会被归类为球。然而,这被证明不是一个主要问题,因为它们通常不会出现在翻转区域。如果我们包括特定弹球随时间的速度跟踪,这将是一个更大的问题。

创建HSV树

..