Arduino颜色分类器项目

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

设计


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

颜色分拣机Arduino项目Solidworks模型

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

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

以下图纸可用于激光切割机箱所有零件:

构建Arduino颜色分类器


我在这个项目中使用的材料是一个3毫米的纤维板。我按照图纸在纤维板上重新画了零件,用小手锯把所有零件切割成尺寸。

颜色分拣机 - 纤维板部件

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

颜色分选机装配

然后我用万能胶水把两个伺服电机粘在他们的平台上,并把它们连接到组件上。

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

分色机伺服电机

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

分色机TCS3200颜色传感器

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

Arduino彩色分拣机电路示意图

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

yaboAG娱乐城披露:这些是附属链接。作为一个亚马逊助理,我从合格的购买中赚取。

Arduino颜色分类器源代码


此时,我们首先需要对Arduino进行编程,然后完成组装。这里是Arduino代码:

/*Arduino项目-颜色分拣机**Dejan Nedelkovski,www.HowToMechatronics.com**/#包括#定义S0 2#定义S1 3#定义S2 4#定义S3 5#定义传感器输出6伺服topServo;伺服底部伺服;int频率=0;int颜色=0;无效设置(){pinMode(S0,输出);pinMode(S1,输出);pinMode(S2,输出);pinMode(S3,输出);pinMode(sensorOut,INPUT);//将频率缩放设置为20%数字写入(S0,高);数字写入(S1,低);topServo.attach(7);bottomServo.attach(8);Serial.begin(9600);}void loop(){topServo.write(115);delay(500);for(int i=115;i>65;i--){topServo.write(i);delay(2)}delay(500);color=readColor();delay(10);开关(颜色){case 1:bottomServo.write(50);break;case 2:bottomServo.write(75);break;case 3:bottomServo.write(100);break;case 4:bottomServo.write(125);break;case 5:bottomServo.write(150);break;case 6:bottomServo.write(175);break;case;case 0:break;}delay(300);for(int i=65;i>29;i--){-topServo.write(i);delay(2)}delay(200);对于(int i=29;i<115;i++){topServo.write(i);delay(2);}color=0;}//自定义函数-readColor()int readColor(){//设置要读取的红色滤波光电二极管数字写入(S2,低);数字写入(S3,低);//读取输出频率=脉冲信号(传感器输出,低);int R=frequency;//在串行监视器串行上打印值。打印(“R=”);//打印名称串行。打印(频率);//打印红色频率串行。打印(“”);延迟(50);//设置要读取的绿色滤波光电二极管数字写入(S2,高);数字写入(S3,高);//读取输出频率=脉冲信号(传感器输出,低);int G=frequency;//在串行监视器串行上打印值。打印(“G=”);//打印名称串行。打印(频率);//打印红色频率串行。打印(“”);延迟(50);//设置要读取的蓝色滤波光电二极管数字写入(S2,低);数字写入(S3,高);//读取输出频率=脉冲信号(sensorOut,低);int B=frequency;//在串行监视器上打印值serial.print(“B=”);//打印名称serial.print(frequency);//打印红色频率serial.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串行监视器上读取的颜色。

在循环部分,我们的程序从移动顶部开始伺服电机到战马的位置。注意,这个值115适合我的零件和我的伺服电机,所以你应该调整这个值以及以下值的伺服电机根据你的构建。

接下来使用“for”循环,我们将旋转并把彩虹柱带到颜色传感器的位置。我们使用“for”循环,这样我们就可以通过改变循环中的延迟时间来控制旋转的速度。

接下来,在半秒的延迟之后,使用定制函数readColor(),我们将读取skittle的颜色。下面是自定义函数的代码。利用颜色传感器的4个控制引脚和频率输出引脚读取柱状图的颜色。传感器为每个彩虹读取3个不同的值,红色,绿色和蓝色,根据这些值,我们告诉什么是实际的颜色。为更多的细节TCS3200颜色传感器是如何工作的你可以查看我之前的详细教程。

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

这里是我从传感器得到的每个彩虹的RGB值。请注意,这些值可能会变化,因为传感器并不总是准确的。因此,使用这些“if”语句,我们允许传感器对特定颜色的测试值误差为+-5左右。例如,如果我们有一个Red skittle,第一个if语句将为真,变量color将得到值1。这就是readColor()自定义函数所做的,然后使用“switch-case”语句,我们将底部伺服器旋转到特定位置。最后,我们进一步旋转顶部的伺服电机,直到skittle落入导轨,并再次将其送回初始位置,以便重复这个过程。

完成的设计


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

颜色分拣机Arduino板

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

Arduino颜色分类器项目

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

94年响应

  1. 杜邦公司注册在芳族聚酰胺纤维商品上的注册商标

    嗨,伟大的项目!

    我只是想知道Arduino是如何支持的。因此,代码从计算机上传到arduino,但是它被拔掉并用适配器供电?那是刚插入墙上的插座吗?

    回复
    • 德扬Nedelkovski

      大家好,谢谢!是的,上传时Arduino是通过电脑的USB连接和供电的。上传代码后,Arduino由一个5V适配器供电,这可以从本文提供的电路原理图中看到。

      回复
  2. SMM2

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

    也真的很酷的项目!

    回复
  3. 马修罗森

    我的电脑无法打开slddrw文件,除非买一个5美元的应用程序。

    回复
    • 德扬Nedelkovski

      绘图文件是。rar文件,这是一种非常常见的文件格式,可以很容易地打开或/和提取,甚至在线。我希望你能想办法打开它。

      回复
  4. Afif Zakuan

    先生,你的主意太棒了。我想开发这个项目为我的最后一年项目(FYP)。你能在这个项目上给我更多指导吗?我想我想在整理后添加声音为开发。希望不久能收到你的来信

    马来西亚- - -

    回复
  5. Atikah Fatmawati.

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

    回复
  6. nabil.

    嗨,德扬,

    你做了一个伟大的项目。我正在尝试使用TCS3200颜色传感器与4 led直接在板上(没有腿…传感器有圆形…请参阅这个链接:(link REMOVED)。在arduino中测试草图时,我发现颜色的读数变化很大。这是否意味着这些引导应该接近传感器船以获得准确的值,如在你的项目,或我应该购买一个像在你的项目?
    请建议,
    当做
    nabil.

    回复
  7. Piyal

    你好,先生
    如何调整Top伺服电机的值旋转,并将skittle带到颜色传感器检测其颜色。

    回复
  8. 没有μhyun

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

    回复
  9. sayali

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

    回复
    • 德扬Nedelkovski

      传感器不稳定,读取时会出错。另外,它的读数取决于几个因素,比如你正在阅读的颜色,以及环境照明。因此,如果颜色较暗,如果使用同一颜色对象并在日光下进行测试,可能会得到不同的读数。
      为了使其工作,必须测试每个物体的颜色读数,并根据读数调整代码底部的R、G和B值。

      回复
      • sayali vatsa

        颜色传感器的读数随机变化。橙色,红色,蓝色的彩虹糖被随机分类。传感器故障?

  10. 塞萨尔

    你好,我试图复制你的项目,但我的servos只是不动,我一直使用不同的电源,甚至一个5v-2A电源,但它不工作,
    你能告诉我你用什么电源给你的电子设备供电吗???yabo7. com
    你能给我一些建议吗?”

    回复
  11. Mishi

    你好。我按照你的指示和代码,但是两个伺服系统未运行。可能是什么原因?

    回复
  12. 情景应用程序

    嗨,德扬先生
    好的项目

    我尝试同样的项目和复制您的代码到我的Mega2560。我已经按照原理图做了。但是,我的底部伺服不工作。什么错了吗?

    谢谢你!

    回复
  13. 基思

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

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

    再次感谢如此清晰和简单的方法。

    回复
  14. 小吃

    你好,先生。这个项目我们需要用usb连接arduino板和电源适配器。

    回复
  15. 你好,请帮我一下,当我把蓝色的东西放在颜色传感器上时,它发出的是绿色

    回复
  16. 我可以用sg909g伺服电机做两个位置吗??通过使用薄(非常轻)胶合板……!!!!!!

    回复
  17. 汤米

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

    回复
    • 德扬Nedelkovski

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

      回复
  18. 阿梅拉Dz

    你好!如何手动调整传感器值以匹配颜色?谢谢你的回答

    ps伟大的项目!

    回复
  19. 卡洛斯

    嘿。
    我做了整个模型,得到了和你完全一样的部件,但是我的TCS3200在面板上有红色的led,而不是白色的。
    而且,对于每种颜色(R, G或B),它读取的值都在15000左右。
    你知道为什么会这样吗?

    回复
    • 德扬Nedelkovski

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

      回复
  20. cognitio

    您好,我有一个问题 - 同时尝试设置一切,如此所解释的那样,我无法根据颜色变化让我的传感器电机旋转。它只是保持不变。电机很好,用工作替换它产生相同的结果。你有什么可能是这个问题的暗示吗?谢谢。

    回复
    • 德扬Nedelkovski

      你好,问题可能是你从颜色传感器得到的值和我的值不匹配。首先,您必须查看从颜色传感器获得的特定颜色的值,然后在readColor()自定义函数中调整这些值,其中最后一个“if”语句位于该函数中。

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

    回复
  22. 何塞·卡拉斯科

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

    回复
  23. BHAVESH CHAUHAN

    很好的项目…尺寸单位是毫米我想..我被图表中的比例1:5弄糊涂了。。

    回复
  24. 叫我比利

    你好,先生
    如果我不能写得很好,我很抱歉
    我想问一下,这个arduino可以用彩色传感器读取2秒的平均颜色,以便“告诉”这是基于颜色的内容
    比如苹果里的红色,因为苹果并不是真正的红色。我想如果我们在几秒内取平均值,这个arduino可以告诉它一个苹果,等等
    如果你能帮助我请联系我,因为我对你的想法感兴趣

    回复
    • 德扬Nedelkovski

      确保它可以用于此类目的。但这取决于你将红色苹果比较什么。例如,如果将它们与绿色苹果进行比较,则可能很容易区分颜色。

      回复
      • 叫我比利

        我的意思是只看红苹果或绿苹果
        但是,接下来是
        输出正在抵消“Apple”和LCD上显示的信息输出
        例如,我把绿苹果和红苹果放在与传感器集成的管道中,它会自动排序1轮中有多少绿苹果和多少红苹果
        我真的需要您的帮助,先生

  25. 汤姆佩尔金斯

    美好的一天,先生,

    很棒的项目。我只有一个问题-我如何改变方向的顶级伺服电机?动作是对的,只是方向。我需要把它从逆时针改为顺时针。

    谢谢你

    回复
  26. 维克多Mercier

    如果分拣员把绿色和橙色的彩虹糖混在一起是正常的吗。

    回复
  27. 爱默生

    你好。我正在使用您的项目作为学校机器人学决赛。您的网站非常乐于助人,但我想知道您曾经喂过臭虫的管有多大。这款材料只是一个便宜的塑料吗?谢谢你。

    回复
  28. Shafjohn.

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

    回复
  29. 吉斯Berendsen

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

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

    提前致谢。
    Gijs

    回复
    • 德扬Nedelkovski

      谢谢。您可以使用7.4V为Arduino供电,但您需要将其连接到Power Jack或Vin pin。使用这种方法,7.4V将通过Arduino板的5V稳压器,因此Arduino将没有问题。

      回复
  30. Sadana E.

    嗨。谢谢你的指导。它真的很有帮助。如果这个问题太愚蠢,我很抱歉。
    是否有可能仅使用usb端口为arduino、传感器和伺服器供电?
    我计划使用powerbank作为它的电源。如果可能,如何做到这一点,电子原理图会保持不变吗?

    谢谢。

    回复
  31. 乔恩

    嗨,我认为这是一个非常有趣的项目,我正在学习电子,我将在第一年,我想做一个类似于你的教育目的的工作。yabo7. com
    我想能够报价你的项目,它不会打扰你。

    回复
    • 呵呵

      谢谢!是的,这是学习电子学的好项目,当然,继续吧,我肯定你会玩得很开心的。yabo7. com

      回复
  32. 克里斯

    德扬,

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

    通过阅读评论,这似乎是一个普遍的问题没有底部伺服工作。你能给我一些指导吗?或故障排除技巧?
    如何查看颜色传感器看到的值?

    顺便说一句,你的网站岩石!

    回复
    • 呵呵

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

      回复
  33. 下午好,
    恭喜你有了这个想法!这是惊人的!
    我想知道如果使用S3S2OUTVCC颜色传感器而不是你之前提到的颜色传感器会不会有问题。
    感谢!

    回复
  34. 玛利亚姆

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

    请先生,对此有什么诀窍吗?我担心它要在7月份提交,真的需要你的帮助,谢谢

    回复
    • 呵呵

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

      回复
  35. 鲍勃

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

    PS:就像你的教程一样,它很容易理解。

    回复
    • 呵呵

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

      回复

留话

您的电子邮件地址将不会被公布。

推荐

2019年初学者和爱好者的最佳进入级示波器

初学者和爱好者最好的示波器

推荐

2019年适合初学者的8款最佳Arduino初学者套装

8个最好的arduino初学者工具包

推荐

最佳3D打印机为初学者和爱好者- 3D打印

最好的3d打印机为初学者和爱好者