在本文中,我将向您展示如何制作Arduino颜色分拣机。您可以观看以下视频或阅读下面的书面文章。
设计
我们所需要的一切Arduino项目是一个颜色传感器(TCS3200)和两个爱好者伺服电机,这使这个项目相当简单,但非常有趣的构建它。首先,我使用Solidworks 3D建模软件对颜色分类器进行了设计,其工作原理如下:
- 最初,将在充电器中的彩色清单放入连接在顶部伺服电动机上的平台中。
- 然后伺服电机旋转并将SKLittle带到检测其颜色的颜色传感器。
- 然后底部伺服电机旋转到特定位置,然后顶部伺服电机再次旋转,直到导轨掉落。
在这里,您可以下载3D模型,以及包含构建此Arduino项目所需的所有尺寸的图纸。
以下图纸可用于激光切割机箱的所有部件:
建立Arduino颜色分拣机
我用于这个项目的材料是3毫米刻度光纤板。我根据图纸重绘纤维板上的零件,并使用小手锯切所有部件到尺寸。
一旦我把所有的部件准备好,我就开始组装它们。首先,我用胶水枪组装外部部件。
然后使用通用胶水,我将两个伺服电机粘在其平台上并将其连接到组件上。
之后再次使用胶水,我将导轨安装在底部伺服电机以及顶部伺服电机所需的支撑和支撑台上。
接下来,我插入了一个开关和一个电源插孔,用一个5V适配器为Arduino供电,在第三个平台上我插入了颜色传感器。
我根据以下电路示意图将组件连接在一起。
您可以从下面的链接获取此Arduino项目所需的组件:
- TCS230 TCS3200颜色传感器.......亚马逊/伯格多德/阿里巴巴全球速卖通
- Arduino纳米 ..................................亚马逊/伯格多德/阿里巴巴全球速卖通
- 面包板和跳跃电线.........亚马逊/伯格多德/阿里巴巴全球速卖通
- 伺服电机 .....................................亚马逊/伯格多德/阿里巴巴全球速卖通
- 转变…………………………………。……..亚马逊/伯格多德/阿里巴巴全球速卖通
- 权力杰克 ........................................亚马逊/伯格多德/阿里巴巴全球速卖通
必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。
Arduino颜色分类器源代码
此时,首先,我们需要编程Arduino,然后完成装配。这是Arduino代码:
/* Arduino项目-颜色分类机* *由Dejan Nedelkovski, www.HowToMechatronics.com * */ #bet188官方网站include#define S0 2 #define S1 3 #define S2 4 #define S3 5 #define sensorOut 6 Servo topServo;伺服bottomServo;Int frequency = 0;int颜色= 0;void setup() {pinMode(S0, OUTPUT);pinMode (S1、输出);pinMode (S2、输出);pinMode (S3、输出);pinMode (sensorOut、输入);//设置频率缩放到20% digitalWrite(S0, HIGH); digitalWrite(S1, LOW); 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); switch (color) { 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 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; } // Custom Function - readColor() int readColor() { // Setting red filtered photodiodes to be read digitalWrite(S2, LOW); digitalWrite(S3, LOW); // Reading the output frequency frequency = pulseIn(sensorOut, LOW); int R = frequency; // Printing the value on the serial monitor Serial.print("R= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.print(" "); delay(50); // Setting Green filtered photodiodes to be read digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); // Reading the output frequency frequency = pulseIn(sensorOut, LOW); int G = frequency; // Printing the value on the serial monitor Serial.print("G= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.print(" "); delay(50); // Setting Blue filtered photodiodes to be read digitalWrite(S2, LOW); digitalWrite(S3, HIGH); // Reading the output frequency frequency = pulseIn(sensorOut, LOW); int B = frequency; // Printing the value on the serial monitor Serial.print("B= ");//printing name Serial.print(frequency);//printing RED color frequency Serial.println(" "); delay(50); if(R<45 & R>32 & G<65 & G>55){ color = 1; // Red } if(G<55 & G>43 & B<47 &B>35){ color = 2; // Orange } if(R<53 & R>40 & G<53 & G>40){ color = 3; // Green } if(R<38 & R>24 & G<44 & G>30){ color = 4; // Yellow } if(R<56 & R>46 & G<65 & G>55){ color = 5; // Brown } if (G<58 & G>45 & B<40 &B>26){ color = 6; // Blue } return color; }
代码描述:
因此,我们需要包括“servo .h”库,定义将连接到颜色传感器的引脚,创建伺服对象,并声明程序所需的一些变量。在设置部分中,我们需要将引脚定义为输出和输入,设置颜色传感器的频率缩放,定义伺服引脚,并启动串行通信,以打印串行监视器上读取的颜色结果。
在循环部分中,我们的程序从移动顶部开始伺服电机到Skittle充电器的位置。请注意,此值115适用于我的部件和我的伺服电机,因此您应该根据构建调整此值以及伺服电机的以下值。
接下来使用“for”循环,我们将旋转并将skittle旋转并将skittle带到颜色传感器的位置。我们正在使用“for”循环,以便通过在循环中更改延迟时间来控制旋转的速度。
接下来,在半秒钟的延迟之后,使用自定义的函数readColor(),我们将读取游戏的颜色。下面是自定义函数的代码。利用颜色传感器的四个控制引脚和频率输出引脚,我们可以读出游戏板的颜色。传感器读取每个球的3个不同的值,红,绿和蓝,根据这些值我们告诉什么是实际的颜色。为更多的细节TCS3200颜色传感器如何工作你可以查看我之前的详细教程。
这是我从传感器获得的每个游戏的RGB值。注意,这些值可能会变化,因为传感器并不总是准确的。因此,使用这些“如果”语句,我们允许传感器对特定颜色的测试值有大约+-5的误差。例如,如果我们有一个Red sklittle,第一个“if”语句将为真,变量“color”的值将为1。这就是readColor()自定义函数所做的,然后使用“switch-case”语句,我们将底部的伺服器旋转到特定的位置。在最后,我们进一步旋转顶部伺服电机,直到球落进导轨,并再次送它回到初始位置,以便重复这个过程。
完成设计
上传代码后,我使用胶枪固定Arduino板。
然后使用透明的塑料瓶,我制造充电器,以及顶部将其粘在装配并完成项目。
随意询问以下意见部分中的任何问题。
嗨,伟大的项目!
我只是想知道Arduino是如何动力的。因此,代码从计算机上传到Arduino,但随后将使用适配器拔下电源,然后使用适配器供电?那是,只需插入墙壁插座?
大家好,谢谢!可以,上传时Arduino是通过电脑USB连接和供电的。上传代码后,Arduino由一个5V适配器供电,这可以从本文提供的电路图中看到。
[…] 为你而做?作为最近教程的一部分,Dejan Nedelkovski已经建立了使用TCS3200颜色传感器,两个Hobbyist伺服电机以及Arduino的“Arduino Color Sort”所称的内容,以及Arduino [...]
嗨,我只是想知道你如何将GND和5V从所有三个组件连接到Arduino Nano,而无需使用面包板或屏蔽。由于只有5V和两个用于GND的引脚,并且您有3个组件。
也非常酷的项目!
谢谢!
我一起焊接了4个跳线。
你能把pdf格式的文件发给我吗?我的电脑没有5美元的应用程序就打不开slddrw文件。
绘图文件位于.rar文件中,这是一个非常常见的文件格式,即使在线也可以轻松打开或/和提取。我希望你能找到打开它的方法。
你好大师,我想问一下开关和电源千斤顶使用的东西
请重新检查文章,我有添加链接,所以你可以看到什么开关和电源插座可以使用。
先生,你的想法太棒了。我想开发这个项目为我的最后一年的项目(FYP)。你能就这个项目给我更多的指导吗?我想我想添加声音后的分类,为发展。希望很快能收到你的来信
-马来西亚-
谢谢。嗯,我认为视频和文章它自我涵盖了你所需的一切,以便制作这个项目,你得到了3D模型,图纸,电路原理图和源代码。
你好,先生,我真的受到了你的方式。无论如何,我只是想知道自从你使用Arduino nano,如果我使用Arduino Uno,它会以同样的方式工作吗?我需要很多指导。谢谢
是的,肯定会成功的。
你好先生,我有同样的问题,因为我的arduino nano不使用pc。我无法编程Arduino nano我该怎么办?我应该使用uno而不是nano吗????请帮忙 ..
当然,您也可以使用不同的arduino。
这个设计工具名称是什么?
扎实的作品。
嗨,德扬,
你的项目做得很好。我正在尝试使用TCS3200颜色传感器与4 led直接在板上(没有腿…传感器是圆形的…请看这个链接:(链接删除)。我注意到在arduino中测试草图时,颜色的读数变化很大。这意味着这些引导周围应该接近传感器船得到准确的值,就像在你的项目,还是我应该买一个像在你的项目?
好心提醒 ,
问候,
nabil.
是的,读取是那么多稳定,同样的情况是带有矿井传感器。虽然,传感器越靠得更好。
你用的是什么适配器?5 v / 1或5 v / 2吗?
我使用了5V / 2A,但5V / 1A也可以做这项工作。
嗨,先生
如何调整顶部伺服电机中的值旋转,并将Skittle带到检测其颜色的颜色传感器。
调整topServo.write()函数的值,或for循环的范围。
我买了TCS230和TCS3200以上的颜色传感器。今天就到了。但是颜色传感器和纤维板不匹配。纤维板上的正方形很小,用来放置传感器。你怎么把它放进纤维板里?
纤维板的平方尺寸为2.5cm x 1.3cm。
但颜色传感器的尺寸为3cm x 1.3cm。
完全增加纤维板整体,传感器将适合。
你用过哪条跳线?
正常的…
我已经完成了模型,项目正好工作。只是颜色传感器遇到混淆:/
我已经根据颜色传感器设置了频率。但仍然底部伺服旋转在不同的角度相同的颜色
我应该怎么办 ?
嗯,传感器并不稳定,在读取时会产生错误。另外,其读数取决于几个因素,如显然您正在阅读的颜色,但也是环境照明。因此,如果您在使用相同的颜色对象并在日光测试中,您可能会获得不同的读数。
为了使其工作,您必须测试每个对象的颜色读数,并根据您的读数调整在代码底部找到值的R,G和B。
颜色传感器的读数随机变化。橙色,红色,蓝色的彩虹球被随机排序。传感器故障?
是的,传感器是问题。您必须将程序调整为您的读数。
嗨. .İt is great project! I did this but bottom servo not working.
我认为颜色传感器的输出与Arduino没有连接,检查它一次@Mustafa
您好,我试图复制您的项目,但我的伺服电源不会移动,即使是5V-2A电源,我也一直在使用不同的电源,但它不起作用,
你能告诉我你们的电子产品是用什么电源供电的吗?必威lol
你可以给我的任何建议??'
我们使用什么样的电机?你试着换两款电机吗?这是这样做的吗?
你好。我按照你的指示和代码,但两个伺服单位未运行。可能是什么原因?
它可以是任何东西。你可以尝试更具体。还要仔细检查您的连接。
嗨,德州先生
好的项目
我尝试将代码复制到Mega2560中。我遵循示意图。但是,我的底部伺服不起作用。怎么了?
谢谢
谢谢。你用的是哪种伺服电机?仔细检查你的连接。
先生,怎么给Arduino供电??我可以直接和5v电池连接吗,或者我必须使用Arduino电源模块,请帮助或者提供一个电源链接在网上购买。
好吧,如果您有一个5V电池适配器,您可以将其直接连接到Arduino的5V引脚。
嗨,谢谢你对我下一个项目的灵感。只需等待我的TCS3200传感器即可。
在阅读和理解您的代码时,我发现了2个拼写错误(当然,这并不影响功能,只是我对它如何工作的初步理解)。betway在第116行和第128行,你重复注释“//打印红色频率”,但这些行应该分别表示绿色和蓝色。
再次感谢这样一个清晰而简单的方法。
Hai Sir。对于这个项目,我们必须通过USB和电源适配器连接Arduino板。
你可以使用它们中的任何一个。
你好,请帮我一下,当我试着把蓝色的物品放到颜色传感器上时,它会发出绿色
你必须手动调整传感器的值,以匹配真实的颜色。
如何????我可以这样做吗???
我可以用SG90 9g伺服电机在两个位置??通过使用薄的(非常轻的)胶合板…!!!!!!
肯定,他们会没事的。
非常感谢......我正在这样做的项目作为我的主要项目
你好,
对于代码底部的if语句,为什么只使用两种颜色呢?
if(r32&g55){
颜色= 1;/ /红色
}) - >仅使用红色和绿色。您为什么不使用红色,绿色和蓝色在每个陈述中?
谢谢,
你好,that’s because the sensor outputs were not that precise and accurate and I was getting very similar values, close to each other, for each R, G and B. So in order to better separate, or recognize the colors I made the “if” statements in such a way to use only two colors for defining the colors I needed.
你好!如何手动调整传感器值以匹配颜色?感谢您的回答
PS伟大的项目!
打印要进入串行监视器的值,然后在ReadColor()自定义功能中调整它们。
嘿。
我建了整个模型,得到了和你一样的零件,但是我的TCS3200在面板上有红色的led,而不是白色的。
此外,对于每种颜色(R,G或B),它读取的值均约为15000。
知道为什么会这样吗?
嗨,嗯,你可能有一个不同的模块版本,但它应该是一个问题,你可以做到它的工作。您只需在ReadColor()自定义函数中的“if”语句中调整每个颜色的值。
您好,我有一个问题 - 在尝试设置所有内容的时候,我无法让我的传感器电机根据颜色变化旋转。它只是保持不变。电机很好,用工作替换它产生相同的结果。你有什么暗示可能是这个问题的暗示吗?谢谢。
你好,问题可能是你从颜色传感器得到的值和我的值不匹配。首先,必须查看从颜色传感器中获得的特定颜色的值,然后在readColor()自定义函数中调整这些值,最后一个“if”语句在这里。
你好,德扬,
这是一个非常好的项目,但我有一个问题。其中一个伺服电机反复在同一方向上移动,但底部伺服电动机根本不会移动。我应该怎么办?
您没有与我的颜色相同的值,所以你应该调整它们。
嘿伙计,我有一点(巨大的)问题,当我试图上传程序时,它说“”读取影科学“没有在这个范围内宣布”我不知道它会发生这种情况,我检查了整个程序,但它是与此页相同。
我和Arduino一样糟糕,所以我希望你能帮助我解决它。
如果代码中出现了一个拼写错误,您可能没有正确地复制它。
很好的项目......尺寸是mm,我猜..我与图中的第1:5的缩放相混淆..
你好,先生
如果我不能写好,我很抱歉
我想问一下,这个arduino可以用彩色传感器读取2秒的平均颜色,以便“告诉”这是基于颜色的
就像苹果的颜色是红色,因为苹果并不是真正的红色。我想如果我们在几秒内取一个平均值,这个arduino可以告诉这个苹果,等等
如果你能帮助我请联系我,因为我对你的想法感兴趣
确保它可以用于此类目的。但这取决于你将红色苹果比较什么。例如,如果将它们与绿色苹果进行比较,则可能很容易区分颜色。
我的意思是读红苹果或绿苹果
但是,下一个是
输出正在抵消“Apple”和LCD上显示的信息输出
例如,我将绿色和红色的苹果放入与传感器集成的管道中,自动它会对一轮排序中的绿色苹果和红苹果中有多少种
我真的需要您的帮助,先生
美好的一天,先生,
令人惊叹的项目就在那里。我有一个问题 - 如何改变顶级伺服电机的方向?我得到了纠正的动作,就是方向。我需要从反顺时旋转到顺时针更改它。
谢谢你
伺服电机可以旋转180度,所以它是由你来放置/定位伺服电机,以便你可以想要的运动或方向。
这是正常的,如果有时分拣机将混合一个绿色和橙色的彩虹糖。
是的,彩色探测器并不是那么准确的是正常的。
你好。我正在使用您的项目作为学校机器人决赛。您的网站非常乐于助人,但我想知道您曾经通过的管道喂养的大量。这款材料只是一个廉价的塑料吗?谢谢你。
嘿,我把管从简单的水中或瓶子里的东西制成。
我的底部伺服电机不工作。我需要做什么?我也重新检查了我的连接。但这并没有错。
如果您使用Arduino供电,则您没有足够的电源供电。尝试使用外部电源。
嘿,你不可能拥有一个跑步的草图吗?
你好,
你完成的好项目。
也是你提供的粉丝的支持很棒!
我只是在用arduino开始,这是我第一个真正的项目。
关于供应电力,我可以在arduino的原始别针上放置7,4v lipo电池吗?
也许你可以给我推荐一些编程教程,我只使用过Codesys 2.3中的功能框图与PLC一起使用。
提前致谢。
吉斯
谢谢。你可以使用7.4V为Arduino供电,但你需要将其连接到Power Jack或Vin针上。使用这种方法,7.4V通过Arduino板上的5V调节器,所以Arduino工作没有问题。
嗨。谢谢你的指导。它真的很有帮助。如果问题太蠢了,我很抱歉。
是否可以仅使用USB端口为Arduino,Sensor和Servo供电?
我计划使用PowerBankk作为电源。如果有可能,如何做到这一点,电气原理图保持不变吗?
谢谢你。
谢谢。电气原理图保持不变,您应该能够用PowerBank为项目供电。
嗨,我认为这是一个非常有趣的项目,我正在学习电子产品,我要在第一年进入,我想做一个类似于你的教育目的的工作。必威lol
我希望能够引用你的项目,它不会打扰你。
谢谢!是的,这是一个学习电子学的好项目,当然,去吧,我相信你会很高兴建造它。必威lol
德州,
我已经建立了颜色分类器,我是新手Arduino和问题。我的底部伺服将不会移动。我给传感器显示了几种不同的颜色。我已经尝试了一个备用的伺服电机,我已经检查和重新检查我的跳线和布线原理图。此外,我的顶部伺服似乎缩放不正确,因为它没有足够远的摆动两个方向,以拾起一个skittle,并把它下滑槽。
通过评论阅读,这似乎是一个常见问题而不是底部伺服工作。你能提供一些指导吗?或故障排除提示?
我怎样才能看到颜色传感器看到的值?
顺便说一下你的网站岩石!
谢谢你!是的,这是真的,许多问题与底部伺服。我可以猜测的是,颜色传感器没有读取正确的值。您需要测试从颜色传感器获得的值,并在代码底部的if语句中调整值。
另一种测试伺服是否正常的方法,是手动设置“int color = 0;”变量,它位于代码的顶部,任何1到6的内容,所以伺服应该移动到任何这些位置。如果这是有效的,那就是问题肯定是您从传感器中获得的值与代码底部的If语句不匹配。
嗨,我无法打开solidWorks文件。您曾经使用过的版本是什么?
嘿,这是2017年版。
这个设计的高度是多少?
30厘米左右。当然,你可以修改它。
下午好,
恭喜你的想法!这是惊人的!
我想知道它是否成为使用S3S2OUTVCC颜色传感器而不是您之前提到的问题的问题。
感谢!
当然,您可以使用不同的颜色传感器,但需要适当编程。
非常感谢,真的帮助了我!
先生,你好
伟大的项目
我让它成为一切正常工作好,但是参议员并没有给出一致的RGB读数,他们不是我可以决定任何范围的方式
如果我给出一个大范围的红色橙色紫色都在混合
先生,有什么花招吗?我担心要在7月提交,真的需要你的帮助,谢谢
嘿,谢谢!问题在于传感器本身,它不是那么稳定和可靠。尝试使用不同的环境光,尝试用一个简单的灯泡或其他东西给传感器阅读区域增加更多的光。
德扬,用3D打印机做的分类器,有一些小问题。修改代码的顶级伺服位置,方便。颜色传感器不是真正的辉煌,但改变了如果声明,以允许相当广泛的读数。我的问题是一切工作良好,直到我连接底部伺服,然后它做奇怪的事情。两个伺服器来回抖动。尝试了不同的伺服系统,不同的UNO,不同的电源。将Uno引脚从8改为9,没有区别。有什么想法?是的,仔细检查了线路!!
就像你的教程一样,很容易上手。
嘿,我不太确定连接底部伺服时可能会出现什么问题。很多人报告说他们的底部伺服系统有问题。我没有任何问题。我建议从单独的,外部电源供电的伺服,而不是Arduino 5V引脚。还要确保正确设置了if语句,以便一切正常工作。
另外,尝试一步一步一步,用一个简单的代码,将首先移动顶部伺服,然后是底部伺服检查它是代码还是servos问题。尝试对其外部电源,尝试两个伺服器的其他其他可用的Arduino引脚。