设计一款颜色分类机器人,用于投票系统
扫描二维码
随时随地手机看文章
计票台
用红色、黄色和绿色的珠子填充头部。按下按钮。头部开始数所有珠子,根据颜色将它们吐到不同的罐子里,并在一个小显示器上更新颜色计数。
在我们的工作社区,我们使用投票系统来告诉我们一周过得怎么样。
人们摘下一颗珠子,放在罐子里。绿色表示“我这周过得很好”,黄色表示“这周还行”,红色表示“糟糕的一周”。有人数了数所有的颜色并做了一个报告。我做了这个计票台来处理计票过程。
设计
我用橡皮泥做了一个模型。我做了一个3D扫描,并在Tinkercad中做了进一步的编辑。为了能够进行最终的设计和彩色打印(不一定是原始颜色),我需要使用Autodesk Fusion,它可以处理原始的80 MB扫描模型的全彩。
原则
小精灵的头上有一个漏斗状的洞,要用珠子填满。珠子一个接一个地穿过管子,停在管子的底部。颜色传感器读取颜色。整个头部随之旋转,而珠子继续从精灵的嘴里滚出来,沿着它的舌头滚进罐子里,同时颜色计数也在更新。整个过程由智能手机控制。
Detaileddescription
头部在推力轴承上旋转,推力轴承由螺栓固定在底板上的环形齿轮组成。环形齿轮有8个轴承球的凹槽。头部的底部有一个类似的凹槽,允许头部在球上旋转。行星齿轮系统由连接在头部的连续伺服电机提供动力,旋转太阳齿轮。附在头部的两个行星齿轮将动力传递给环形齿轮。其中一个行星齿轮上有脉冲探测器的标记,用来测量运动的量。
当一个珠子落入漏斗管时,它停在鳍状部分,一个象限形状的部分。当鳍状肢处于最远的位置时,鱼头落入鳍状肢的一个洞中。鳍状肢移动一点,将头部放置在颜色传感器下。确定颜色后,转动头部,使舌头指向正确的罐子。鳍进一步旋转,鱼头落入下一个管子,让鱼头从嘴中滚出来。这时,下一颗珠子已经落入漏斗的管中,并停在了鳍上。
更详细的描述
一颗珠子落在鳍状肢上。
鳍状肢旋转,使珠子落入鳍状肢的孔中。鳍状肢的高度将只适合孔中的一个头。
脚蹼旋转,使头部放置在LDR/RGB LED单元(颜色传感器)上。现在颜色确定了。黑色顶板和黑色底板将颜色检测单元与环境光隔离。鳍状肢必须是黑色的。在这一点上,整个头部需要旋转,使其落入正确的罐子。
最后,鳍状肢旋转到初始位置,让鱼头落入喉管,并进一步离开口腔,沿着舌头滚下。下一个珠子很有可能落在鳍状肢上。
LDR/RGB LED单元
通过这种设计,极少的环境光应该进入为颜色识别过程而创建的房间。但是,在连续点亮红、蓝、绿led灯之前,也可以测量完全的暗度,作为参考值。该值可以从每个颜色值中减去。
从一个空的房间里得到回应也很重要。环境光和红、绿、蓝光的响应。
如果环境光看起来不重要(无论房间的照明是什么,或者房间里是否有一个头,LDR都会给出相同的响应),我将很高兴地忽略所有与环境光有关的内容。在这种情况下,我可以简单地得到四种不同情况的RGB配置文件。使用10位AD引脚,RGB三元组值可能类似于:
•红珠(600,150,170)
•绿珠(120、850、130)
•黄珠(580,730,140)
•无正面(100,130,70)
每个RGB三元组都是3D色彩空间中的一个点。当一个新的珠子被检查时,它的颜色轮廓在空间中形成一个点。使用3D毕达哥拉斯算法,计算到每个已知颜色(或没有头盒)的距离,以找出最可能的颜色。如果没有检测到明显的颜色,要么是新的颜色,要么是枪头在枪膛中的位置不合适。腔内的底板应引导焊头到一个位置。在模棱两可的情况下,鳍状肢可以前后旋转以使头部处于更好的位置。
需要考虑的事情
如果LDR/RGB LED方法似乎不可靠,RGB三元组可以转换为另一种颜色空间,如HSV,其中更多的重点可以给予H通道。
如果灯头的光滑表面反射太多颜色,RGB LED的效果可以使用PWM降低。我们想创造一种情况,只有珠子的真实颜色被LDR反射和捕捉。
由于小精灵的设计,整个结构根据确定的颜色旋转。头部位于固定的环形基座的顶部,该基座具有作为轴向或推力球轴承的圆形凹槽。环的内缘在行星齿轮中起环形齿轮的作用。
为了完成推力轴承,头部部分的底部有类似的凹槽,允许头部以低摩擦旋转。连续伺服电机附在太阳齿轮上。太阳齿轮两侧的两个行星齿轮将运动传递给环形齿轮。嗯,环形齿轮是固定的,使行星和太阳旋转。整个头部与行星一起旋转,行星的轴线牢牢地固定在头部底部。
除钢珠外,其余部件均为3D打印PLA。编码器齿轮(行星齿轮之一)以黑色PLA印刷,在顶层有白色图案,以创建红外传感器的图案。环形齿轮有84个齿。行星各有35颗牙齿,太阳有14颗牙齿。编码轮图案有8个白色扇区。我将只计算8个部门,而不是16个过渡。
当编码轮的35个齿通过时,它已经进行了一次革命。并行进了84个齿圈齿轮中的35个齿。360度的35/84等于150度。我很想增加编码器齿轮上的扇区数量。有10个扇形,一个扇形对应15度,这是一个很好的角度,可以达到30度、45度、60度、90度、120度或360度的任何简单分数。
如果我坚持8个扇形,其中一个扇形是18.75度。如果我需要更好的分辨率,我不仅可以数出一种颜色的8个区域,还可以数出从一种颜色到另一种颜色的16个过渡。
红外传感器工作与模拟输入引脚。我将只使用一个红外LED/光敏电阻单元,没有自己的AD电路。
光敏电阻将根据它接收到的红外光量产生一个可测量的电压。编码器轮有白色和黑色的部分。所以当轮子转动的时候会有一个最大值和最小值。从白色到黑色的转换,以及在两个方向上的反之亦然,必须对系统进行校准,以便能够控制两个方向的旋转,并且能够计数不是8个转换,而是16个转换,给出9.375度的分辨率。进一步的改进将需要在编码器齿轮或连续伺服电机的定时控制上增加更多的扇区:测量转换之间的时间。将该时间分成更小的单位,并在精确的时间停止电机以达到所需的位置。
但在测试之前,我不能确定扇区的大小是否相等。只有一个传感器,我无法确定旋转的方向。我必须依赖于我的程序知道它旋转头部的方向。
机头和所有运动部件的重量都在8个轴承钢球上,这些钢球沿着文具环齿轮的凹槽滚动。球环将所有8个球固定在适当的位置。由于有弹性的塑料,这些球很容易被推入环中。当球滚动时,没有外力作用在环上,只有轻微的摩擦。所有的力都作用于球和齿环上的凹槽以及机头的底部。
测试打印件
头部有一个相当复杂的底部部分,它附加到一个固定在桌面的环齿轮,并持有伺服与太阳齿轮和两个行星齿轮与球轴承和TCRT5000模块的编码器齿轮(其中一个行星齿轮)。所以我做了一个测试,看看它是否有效。下面是它的实际应用:
注意TCRT5000的红外LED的发光。
我有一个稳定的旋转速度,并测量了TCRT5000的输出:
我很有信心,我可以得到非常准确的读数从编码轮。在我的测试打印中,TCRE5000距离编码器齿轮只有1毫米,而它应该是5毫米。最后的打印,我会加一些毫米。
波浪模式表明,3D打印的编码轮不是很精确。车轮是用黑色PLA 3D打印的。在顶层,我为编码员放置了一个图案。图案是在白色PLA印刷,但因为它只是一层,结果是有点灰色,不是很均匀。我可能会用激光切割一块白色的薄胶粘塑料片,并加上相同的图案,以获得更均匀,更反光的表面。
编码器轮的详细描述
如图所示,来自红外光电晶体管的信号大致遵循正弦波。浪顶的值会变化,浪底的值也会变化。最小浪顶在595度左右。最大浪底在220左右。我们可以肯定地说,410的值既不是顶部,也不是底部。
现在我们准备好实际计算轮子的8个白色部分和8个黑色部分,每个部分的粗略精度为9度(见前面的章节)。我们可以通过检查变化量来找到扇区的中间位置。首先,我们可能需要一些过滤。假设我们取红外光电晶体管最后三个读数的平均值。我们将该值与之前的读数(这是连续三次读数的平均值)进行比较。如果变化率改变符号,我们在波浪的顶部或底部。我们检查实际读数是高于还是低于410,以确定它是哪一个。这样我们就可以检测到16个扇区中的每一个。如果有很多噪音,比如环境红外光,我们可能会得到不想要的标志变化。
如果由于噪声导致变化率的符号变化太多,我们需要一个更好的滤波器。无论如何,如果波浪的顶部相距18度,一个顶部与前一个底部相距9度,如果,由于噪声,我们有两个顶部,这些顶部可能彼此相距只有1或2度,它们中的任何一个都足够好。当磁头旋转时,编码器的逻辑必须每次都知道变化的方向,以及我们是在全波的下半部分还是上半部分。这种准确性来自于这样一个事实,即当我们不太确定我们是在波浪的上半部分还是下半部分时,我们对变化率有一个非常清晰的解读。它接近最大正电荷率或最小负电荷率。当我们处于零变化率时,变化率本身无法判断我们是处于顶端还是底部。但是光电晶体管的绝对值肯定会告诉我们是在顶部还是底部。
通过这种方式,我们将达到旋转头部大约9度的分辨率。将分辨率进一步扩展到4.5度,将要求我们检测到红外光电晶体管读数绝对值的“符号变化”。如果我们把415的平均值设为0。但正如波形图所示,415的平均值并不适用于8个波长中的每一个。
当编码器轮旋转时,速率的变化当然取决于旋转速度。
…我们看到,红色曲线(余弦)显示了蓝色曲线(正弦)的变化率。当蓝色曲线从正变为负或反之时,很容易检测到。当蓝色曲线是水平的时候,无论是在顶部还是底部,都很难看到。但当红色曲线从正变为负或反之时,就会发生这种情况,这更容易检测到。
编码器工作流程
1. 检测最近的顶部或底部。让它成为你的起点。
2. 要在一个方向上移动n步(每步9度),开始移动,直到读数出现符号变化。
3. 继续移动直到一阶导数的符号改变。把这算作一个步骤,然后继续,直到你有n个步骤。
4. 在每个止损点,记住止损点是在波浪的底部还是顶部。知道在阅读时你要找的符号变化是什么。知道一阶导数的符号变化是多少你想把它算作一个阶跃。
从第一步开始,可以找到最近的顶部或底部如下:
检查初始读数。如果高于405,我们正在寻找顶部。向一个方向旋转并计算变化率。如果它是正的,继续直到它变成负的,停在那里,你在顶部。如果它是负的,改变方向,旋转直到它变成负的,停在那里,你在顶部。
如果初始读数低于405,则与上述方法相反。
工作流程
当电源打开时,机器等待一个珠子落入漏斗管。当这种情况发生时,它会再等待10秒,以防用户仍然添加珠子。
如果没有珠子落入管中,机器会要求用户用珠子填充头部并搅拌。
当第一个珠子落入管中10秒后开始排序时,执行以下程序流程:
1. 读珠子的颜色。如果这是第一个一种颜色的珠子,就唱首歌。旋转到相应的jar4。前后旋转塞子以释放珠子,并让下一个珠子落在颜色传感器上。如果颜色传感器看到一个新的头,跳到1 5.1,如果没有看到新的头,来回旋转头,并在5.1多次尝试后跳到5 5.2,说“我想这就是全部。或者你应该搅动这些珠子?”如果看到一个新的头,跳到56。大声读出测试结果并要求用户关闭电源
颜色传感器
我有一个Adafruit TSL2591光传感器。这有点过分了,我会把它留到更重要的事情上。我在某个地方也有一个真正的颜色传感器,但由于这个项目只需要检测三种颜色,所以我不会在这个项目上浪费它。此外,它没有增加有趣和复杂的挑战。所以我选择一个RGB LED和一个光相关电阻(LDR)。
当珠子落入漏斗管并停在塞子处时,RGB LED在珠子上连续发出红、绿、蓝三色光。LDR测量从头部反射的光量。每种颜色都会形成自己可识别的“光谱”。为了得到每种颜色的“三波段光谱”平均值,需要进行大量的测量。
电路
4 *节aa电池
2台伺服电机
1议长
开关
印刷电路板
由于比赛的延误,我没有时间从PCBWay订购PCB,一旦我收到了所有其他硬件,所以我使用CNC路由器自己制作。我描述了这个项目的程序。
这是在EasyEDA中设计的PCB。再一次,由于延迟,我在拿到硬件之前就终止了对欧特克的订阅。
上部有我在这个项目中需要的所有引脚。我还在下部安装了10个引脚,主要是为了稳定。我焊接头到每个孔有一个铜线贯穿。如果我想稍后向Ballothar添加功能,则下部的铜迹线将提供对额外引脚的访问。
简而言之,我将设计导出到SVG文件,其中有铜线和孔。我把它读进了Inkscape,在那里我把所有东西都变成了g代码。所有的孔将是1毫米钻头的任务,所有的铜迹将是另一个任务,研磨到铜表面的路由器钻头。
结果如下:
我做了一个糟糕的工作,定位之前的路由开始。最上面的一个痕迹没有它应有的那么宽。幸运的是,这只是一条数字信号线,不是电源线。另一个是接地,但它只在那一点接地Arduino板,所以没有大电流!
放大:
重要的是要清洁表面,去除所有脱落的薄片。
PCB的一个重要特征是它位于Arduino Giga的背面引脚上。太糟糕了,背面引脚不包括任何模拟引脚,因此我需要两根电线从PCB上穿过千兆级的螺丝孔,到千兆级前面的两个模拟引脚。
外壳
我在他的后脑壳上开了两个洞来装上Arduino Giga和电池组。
Arduino的盖子有四个钉子来固定它。由于测量错误,电池槽太窄了,所以我需要在盖子上添加一些细节来匹配头部的表面。
而不是挂钩,这盖简单地适合到插槽依偎。
末附加组件
当头部准备打印时,我发现我打算使用的漏斗有点太高了。所以我在头部加了一个“皇冠”来抬高它一点。因为Arduino Giga有无数的引脚,我也可以添加一些闪烁的LED。
本文编译自hackster.io