Arduino颜色分类器项目

在本文中,我将向您展示如何制作Arduino颜色分拣机。您可以观看以下视频或阅读下面的书面文章。

设计

我们所需要的一切Arduino项目是一个颜色传感器(TCS3200)和两个爱好者伺服电机,这使这个项目相当简单,但非常有趣的建设它。首先,我使用Solidworks 3D建模软件进行了颜色分类器的设计,工作原理如下:

颜色分拣机Arduino项目Solidworks模型

  • 最初,在充电器里的彩色彩虹下降到附在伺服电机上的平台上。
  • 然后伺服电机旋转并将彩虹带至颜色传感器检测彩虹的颜色。
  • 之后,底部伺服电机旋转到特定位置,然后顶部伺服电机再次旋转,直到铲斗落入导轨中。

在这里,您可以下载3D模型,以及包含构建此Arduino项目所需的所有尺寸的图纸。

以下的附图中,可以使用用于激光切割的所有的情况下的部分:

建立Arduino颜色分拣机

我用于这个项目的材料是3毫米刻度光纤板。我根据图纸重绘纤维板上的零件,并使用小手锯切所有部件到尺寸。

颜色分拣机 - 纤维板部件

一旦我把所有的零件准备好,我就开始组装它们。首先,我用胶枪组装外部部件。

彩色分拣机组装

然后使用通用胶水,我将两个伺服电机粘在其平台上并将其连接到组件上。

之后再次使用胶水,我将导轨粘贴在底部伺服电机以及顶部伺服电机所需的支撑和平台上。

色选机伺服电机

接下来,我插入了一个开关和一个电源插孔,通过5V适配器为Arduino供电。在第三个平台上,我插入了颜色传感器。

分色机TCS3200颜色传感器

我根据以下电路示意图将组件连接在一起。

Arduino彩色分拣机电路示意图

您可以从下面的链接获取此Arduino项目所需的组件:

必威外围提钱披露:这些是附属链接。作为一个亚马逊助理,我从合格的购买中赚取。

Arduino颜色分类器源代码

此时,首先,我们需要编程Arduino,然后完成装配。这是Arduino代码:

/*Arduino项目-颜色分拣机**由Dejan Nedelkovski编写,www.HowToMechatronics.com**/#包括#定义S0 2#定义S1 3#定义S2 4#定义S3 5#定义传感器输出6伺服topServo;伺服系统;整数频率=0;int color=0;void setup(){pinMode(S0,输出);pinMode(S1,输出);pinMode(S2,输出);pinMode(S3,输出);pinMode(sensorOut,输入);//将频率缩放设置为20%数字写入(S0,高);数字写入(S1,低);topServo.attach(7);bottomServo.attach(8);Serial.begin(9600);}void loop(){topServo.write(115);延迟(500);for(int i=115;i>65;i--){topServo.write(i);delay(2);}delay(500);color=readColor();delay(10);switch(color){案例1:bottomServo.write(50);break;案例2:bottomServo.write(75);break;案例3:bottomServo.write(100);break;案例4:bottomServo.write(125);break;案例5:bottomServo.write(150);break;案例6:bottomServo.write(175);break;案例0:break;}delay(300);for(int i=65;i>29;i--){topServo.write(i);delay(2);}delay(200);for(int i=29;i<115;i++){topServo.write(i);delay(2);}color=0;}//自定义函数-readColor()int readColor(){//设置红色滤波光电二极管为读-digitalWrite(S2,低);digitalWrite(S3,低);//读取输出频率频率=脉冲信号(sensorOut,低);int R=频率;//在串行监视器串行上打印值。打印(“R=”;//打印名称串行。打印(频率);//打印红色频率串行。打印(“”);延迟(50);//设置绿色滤波光电二极管以读取数字写入(S2,高);数字写入(S3,高);//读取输出频率频率=脉冲信号(sensorOut,低);int G=频率;//在串行监视器串行上打印值。打印(“G=”;//打印名称串行。打印(频率);//打印红色频率串行。打印(“”);延迟(50);//设置蓝色滤波光电二极管为读取数字写入(S2,低);数字写入(S3,高);//读取输出频率频率=脉冲信号(sensorOut,LOW);int B=频率;//在串行监视器串行上打印值。打印(“B=”;//打印名称串行。打印(频率);//打印红色频率串行。println(“”);延迟(50);如果(R<45&R>32&G<65&G>55){color=1;//红色}如果(G<55&G>43&B<47&B>35){color=2;//橙色}如果(R<53&R>40&G<53&G>40){color=3;//绿色}如果(R<38&R>24&G<44&G>30){color=4;//黄色}如果(R<56&R>46&G<65&G>55){color=5;//棕色}如果(G<58&G>45&B<40&B>26){color=6;//蓝色}返回颜色;}

代码描述:

因此,我们需要包括“伺服.h”库中,定义颜色传感器将连接到的管脚,创建伺服对象,并声明程序所需的一些变量。在设置部分,我们需要将管脚定义为输出和输入,设置颜色传感器的频率缩放,定义伺服管脚,并启动串行通信以打印结果f串行监视器上读取的颜色。

在循环部分,我们的程序从移动顶部开始伺服电机到Skittle充电器的位置。请注意,此值115适用于我的部件和我的伺服电机,因此您应该根据构建调整此值以及伺服电机的以下值。

接下来使用“for”循环,我们将旋转并将skittle旋转并将skittle带到颜色传感器的位置。我们正在使用“for”循环,以便通过在循环中更改延迟时间来控制旋转的速度。

接下来,半秒钟的延迟后,使用定制功能,readColor(),我们将读取撞柱的颜色。这里的自定义函数的代码。使用四个控制引脚和滤色器的频率输出销传感器我们阅读撞柱的颜色。该传感器对每个撞柱,红,绿,蓝3个读取不同的值,并根据这些值告诉我们实际的颜色是什么。更多细节TCS3200颜色传感器是如何工作的你可以检查一下我以前的详细教程。

Arduino颜色传感器教程TCS230颜色传感器

这里是RGB值,我从传感器每个撞柱了。请注意,这些值可以改变,因为传感器并不总是准确。因此,使用这些“if”语句,我们允许在传感器周围+ -5用于特定颜色的测试值的误差。So for example if we have a Red skittle, the first “if” statement will be true and the variable “color” will get the value 1. So that’s what the readColor() custom function does and after that using a “switch-case” statement we rotate the bottom servo to the particular position. At the end we further rotate the top servo motor until the skittle drops into the guide rail and again send it back to the initial position so that the process can repeated.

完成的设计


上传代码后,我使用胶枪固定Arduino板。

颜色分拣机Arduino板

然后使用透明的塑料瓶,我制造充电器,以及顶部将其粘在装配并完成项目。

Arduino颜色分类器项目

欢迎在下面的评论部分提出任何问题。

94关于“Arduino颜色分拣项目”的想法

  1. 嗨,伟大的项目!

    我只是想知道Arduino是如何动力的。因此,代码从计算机上传到Arduino,但随后将使用适配器拔下电源,然后使用适配器供电?那是,只需插入墙壁插座?

    回复
  2. 您好,我想知道您是如何将所有三个组件的GND和5V直接连接到Arduino Nano,而无需使用面包板或屏蔽。因为只有一个引脚的5V和两个引脚的GND和你有3个组件。

    也非常酷的项目!

    回复
  3. 先生,你的想法是辉煌的。我想开发这个项目我最后一年的项目(FYP)。你可以指导我更多关于这个项目呢?我想我要排序的发展之后添加声音。希望能尽快从u听到

    马来西亚- - -

    回复
  4. 你好,先生,我真的被你的行为所鼓舞。不管怎样,我只是想知道,既然你用的是Arduino Nano,我用Arduino Uno也会一样吗?我需要很多指导。谢谢

    回复
  5. 嗨,德扬,

    你做一项伟大的工程。我试图使用带有4主导的直接对板(没有腿的TCS3200颜色传感器...该传感器具有圆形......请访问以下链接:(链接删除)我注意到,颜色的读数变化很大,而测试在Arduino的。不草图这意味着这些导致周围应关闭的传感器船才能得到准确的值作为你的项目,或者我会买一个作为你的项目?
    好心提醒 ,
    当做
    nabil.

    回复
  6. 我买了TCS230以上的TCS3200色感器。所以今天就到了。但是颜色传感器不适合在纤维板上。纤维板上的方框很小,便于放置传感器。你怎么把它放进纤维板里?
    纤维板的平方尺寸为2.5cm x 1.3cm。
    但颜色传感器的尺寸为3cm x 1.3cm。

    回复
  7. 我已经完成了模型,项目正好工作。只是颜色传感器遇到混淆:/
    我已经根据颜色传感器设置了频率。但同一颜色,底部伺服仍然以不同角度旋转
    我该怎么办?

    回复
    • 嗯,传感器并不稳定,在读取时会产生错误。另外,其读数取决于几个因素,如显然您正在阅读的颜色,但也是环境照明。因此,如果您在使用相同的颜色对象并在日光测试中,您可能会获得不同的读数。
      为了使其工作,您必须测试每个对象的颜色读数,并根据您的读数调整在代码底部找到值的R,G和B。

      回复
  8. 您好,我试图复制您的项目,但我的伺服电源不会移动,即使是5V-2A电源,我也一直在使用不同的电源,但它不起作用,
    你能告诉我你用什么电源来驱动你的电子产品吗?必威lol
    你能给我一些建议吗?”

    回复
  9. 嗨,德扬先生
    好的项目

    我尝试将代码复制到Mega2560中。我遵循示意图。但是,我的底部伺服不起作用。怎么了?

    谢谢

    回复
  10. 嗨,谢谢你对我下一个项目的灵感。只需等待我的TCS3200传感器即可。

    在阅读和理解您的代码时,我发现了两个输入错误(当然,这并不影响功能,只是我对它如何工作的初步理解)。betway在第116行和第128行中,您重复注释“//打印红色颜色频率”,但这些行应该分别表示绿色和蓝色。

    再次感谢这样一个简单明了的方法。

    回复
  11. 你好,
    对于代码底部的if语句,为什么只使用两种颜色(即。
    如果(R32 & G55) {
    颜色=1;//红色
    }) - >仅使用红色和绿色。您为什么不使用红色,绿色和蓝色在每个陈述中?
    谢谢,

    回复
    • 嗨,这是因为传感器输出不精密,准确,我变得非常相似的价值观,相互接近,对于每个R, G, b .为了更好的独立,或承认的颜色我犯了“如果”语句以这样一种方式只使用两种颜色来定义我需要的颜色。

      回复
  12. 嘿。
    我内置了整个模型,并得到了相同的精确的零件,你却......我的TCS3200对板,而不是白色的红色LED。
    此外,对于每种颜色(R,G或B),它读取的值均约为15000。
    为什么出现这种情况的任何想法?

    回复
    • 嗨,嗯,你可能有一个不同的模块版本,但它应该是一个问题,你可以做到它的工作。您只需在ReadColor()自定义函数中的“if”语句中调整每个颜色的值。

      回复
  13. 您好,我有一个问题-在尝试按此处所述设置所有内容时,我无法根据颜色变化使传感器电机旋转。它只是保持不动。电机很好,用工作电机替换它会产生相同的结果。您是否有任何关于可能出现问题的提示?谢谢。

    回复
    • 你好,这个问题可能是您从颜色传感器获取的值不符合我的价值观。首先,你必须看到什么值您从颜色传感器获得特定的颜色,然后在readColor()自定义函数,其中最后一个“如果”的语句是调整这些值。

      回复
  14. 你好,德扬,
    这是一个非常好的项目,但我有一个问题。其中一个伺服电机在同一方向反复运动,但底部伺服电机根本不动。我该怎么办?

    回复
  15. 嘿伙计,我有一点(巨大的)问题,当我试图上传程序时,它说“”读取影科学“没有在这个范围内宣布”我不知道它会发生这种情况,我检查了整个程序,但它是与此页相同。
    我对Arduino很不好,所以我希望你能帮我解决这个问题。

    回复
  16. 你好,先生
    如果我不能写好,我很抱歉
    我想问一下,这个arduino可以用彩色传感器读取2秒的平均颜色,以便“告诉”这是基于颜色的
    喜欢红色的苹果,因为苹果没有真正红的颜色。我想,如果我们采取几秒钟的平均值,这Arduino的可以告诉这一个苹果,ECT
    如果你能帮助我请联系我,因为我对你的想法感兴趣

    回复
      • 这是我的意思是刚才读红苹果或绿色
        但是,下一个是
        输出正在抵消“Apple”和LCD上显示的信息输出
        例如,我将绿色和红色的苹果放入与传感器集成的管道中,自动它会对一轮排序中的绿色苹果和红苹果中有多少种
        我真的需要您的帮助,先生

        回复
  17. 好日子先生,

    令人惊叹的项目就在那里。我有一个问题 - 如何改变顶级伺服电机的方向?我得到了纠正的动作,就是方向。我需要从反顺时旋转到顺时针更改它。

    谢谢你

    回复
  18. 你好。我正在使用您的项目作为学校机器人决赛。您的网站非常乐于助人,但我想知道您曾经通过的管道喂养的大量。这款材料只是一个廉价的塑料吗?谢谢你。

    回复
  19. 我的底部伺服电机不工作。我需要做什么?我还重新检查了我的连接。。但这并没有错。

    回复
  20. 你好,
    你做的项目很好。
    你对粉丝的支持也很棒!
    我刚刚开始arduino,这是我的第一个“真正的”项目。
    关于供电,我可以把7,4V的Lipo电池放在arduino的Raw pin上吗?

    也许你可以向我推荐一些编程教程,我只使用过Codesys 2.3中与PLC一起使用的功能框图。

    提前致谢。
    Gijs

    回复
  21. 你好谢谢你的指导。这真的很有帮助。对不起,如果这个问题太愚蠢了。
    是否可以仅使用USB端口为Arduino,Sensor和Servo供电?
    我计划使用PowerBankk作为电源。如果有可能,如何做到这一点,电气原理图保持不变吗?

    谢谢你。

    回复
  22. 嗨,我认为这是一个非常有趣的项目,我正在学习电子产品,我要在第一年进入,我想做一个类似于你的教育目的的工作。必威lol
    我想能够报价你的项目,它不会打扰你。

    回复
  23. 德扬,

    我已经做了颜色分类器,我是Arduino的新手,遇到了问题。我的底部伺服不动。我已经向传感器展示了几种不同的颜色。我已经试用了备用伺服电机,我已经检查了我的跳线和线路示意图。此外,我的顶级伺服似乎规模不正确,因为它没有摆动足够远的任何方向,以捡起一个小七,并下降它的斜槽。

    通过评论阅读,这似乎是一个常见问题而不是底部伺服工作。你能提供一些指导吗?或故障排除提示?
    如何查看颜色传感器看到的值?

    顺便说一下,你的网站太棒了!

    回复
    • 谢谢你!是的,这是真的,许多有问题的底部伺服。我能猜到的是,颜色传感器没有读取正确的值。您需要测试从颜色传感器获得的值,并调整代码底部的if语句中的值。
      另一种测试伺服是否工作的方法是手动设置“int color=0;”变量,该变量位于代码的顶部,从1到6,所以伺服应该移动到这些位置中的任何一个。如果这行得通,那问题就是你从传感器得到的值肯定与代码底部的If语句不匹配。

      回复
  24. 下午好,
    恭喜您的想法!太奇妙了!
    我想知道它是否成为使用S3S2OUTVCC颜色传感器而不是您之前提到的问题的问题。
    Thnks!

    回复
  25. 你好先生
    伟大工程
    我让它成为一切正常工作好,但是参议员并没有给出一致的RGB读数,他们不是我可以决定任何范围的方式
    如果我给出一个大范围的红色橙色紫色都在混合

    PLZ先生对于该即时通讯担心它做任何HV高压伎俩提交七月真的需要帮助乌尔谢谢

    回复
    • 嘿,谢谢!问题是传感器本身,它不是那么稳定和可靠。尝试使用不同的环境光,尝试用一个简单的灯泡或其他东西为传感器读取区域添加更多的光。

      回复
  26. Dejan,使用3D打印机制作分拣机,有一些小问题。修改的代码顶部伺服位置,容易。颜色传感器不是真正的辉煌,但改变了if声明,以允许相当广泛的读数。我的问题是,它所有的工作都很好,直到我连接底部伺服,然后它做奇怪的事情。两个伺服器都来回抖动。尝试了不同的伺服,不同的UNO,不同的电源。把Uno引脚从8改到9,没有区别。有什么想法?是的,仔细检查线路!!

    PS。就像你的教程,很容易效仿。

    回复
    • 嘿,我不太确定连接底部伺服器的时候会有什么问题。很多人报告说底部伺服器出了问题。我没有任何问题。我建议从独立的外部电源供电,而不是Arduino 5V引脚。还要确保正确设置if语句,以便一切正常工作。
      另外,尝试一步一步一步,用一个简单的代码,将首先移动顶部伺服,然后是底部伺服检查它是代码还是servos问题。尝试对其外部电源,尝试两个伺服器的其他其他可用的Arduino引脚。

      回复

留下你的评论