DesignSpark Electrical Logolinkedin
菜单 搜寻
提问问题

2 Oct 2018, 6:32

由 Arduino 支持的机电一体化色选机

如果您像我一样,只喜欢红色或黄色的彩虹糖,那么这个有趣的由 Arduino 支持的项目可能专为您而打造。在此过程中,您将学习如何克服控制步进电动机和伺服电动机的挑战,以及如何对物体进行分类,在此情况下是使用 Arduino 检测物体的颜色。这些基本原理将成为您下一次进行机电一体化或机器人创造的基础。   

项目的完整代码示例和文档位于 Github

分解色选机

色选机能够将彩色计数物(在此情况下为彩虹糖)分成 5 种不同的颜色。其工作方式是将料斗中的计数物装载到由伺服电动机驱动的旋转导向臂中。导向臂中有一个圆形的保持孔,可将计数物移动到 RGB 颜色传感器下方的位置。一旦传感器确定了颜色,由步进电动机驱动的旋转盘就会移动到收集点下方该颜色的正确位置。导向臂然后将计数物移动到喷射孔的上方,在那里落入容器中,此时导向臂返回到其起始位置,然后重复循环。Arduino Uno (715-4081) 微控制器板可协调各组件的功能。

构建这样一台机器要克服许多设计挑战,所以我通过将项目分解成三个独立的组成部分来解决这个问题,这些组成部分均可单独构建和测试。这允许我在将每个解决方案组合到成品机器之前,一次只关注一个较小的设计方面。

深入其中

首先,我设计、制造并编码了旋转盘。使用了 RS Pro 步进电动机 (535-0489) ,这是一台通用双极 4 线电动机,每转 200 步。对于这个项目,它有足够的扭矩,并且在未来的机器中可能应用广泛。

双极步进电动机有两个线圈,当通电时,可以在任一方向非常精确地旋转电动机,一次旋转一步。电动机规格决定了每转的可能步长。为了使用 Arduino 控制电动机,需要一个 H 桥电路,但是为了简化起见,我使用了 EasyDriver 板卡,这是一种具有高质量文档的开源设计。

EasyDriver 只需要 3 个 Arduino 数字输入/输出引脚来控制它。一个引脚发送 1 毫秒时控脉冲使电动机步进。一个引脚决定旋转方向。第三个引脚启动电动机,当电动机静止时,允许减少电流。EasyDriver 的默认设置允许 ⅛ 步的微步进,以提供更平稳的旋转。

StepTest.ino 包含一个阵列。每个阵列索引代表要排序的 5 种颜色之一。阵列值是需要回到旋转盘原点或收集点的零基位置。

int indexArray[] = {0, 4, 3, 2, 1};

旋转盘每移动一个位置,阵列值都会更新。因此,为了将一个特定索引移动到原点,可以沿着最佳方向计算位置数量。setPosition() 函数实现了这一点。

move() 函数获取移动旋转盘的位置数量和方向。因此,要移动 1 个位置,电动机每转步进 200 步,每步 8 微步,5 个位置需要 320 步 (200 * 8 / 5)。下面是实现这一点的重要代码段。

for (int i = 0; i < steps; i++)   // Move the number of micro-steps
 {
   digitalWrite(stp, HIGH); //Trigger one step forward
   delay(1);
   digitalWrite(stp, LOW); // Pull step pin low so it can be triggered again
   delay(1);
 }

这种简单的技术可以用于各种步进电动机项目。

继续前进

接下来介绍色选机平台和移动彩色计数物的导向臂的结构和编码。平台由易于加工的 3 mm 硬板制成。Parallax 标准伺服电动机 (781-3058) 用于控制安装在平台下方的导向臂。伺服电动机自动返回到它们的起始位置,因此是控制导向臂的理想选择。Arduino 伺服库使用单个控制引脚来设置伺服电机从原点开始的旋转度数。

ServoTest.ino 包含单独的函数,即 moveToOrigin()、moveToSensor() 和 moveToEjector(),这些函数涵盖了伺服电机所需的 3 个位置。

下面是用于移动给定度数的代码。循环增量可以增加以加速移动,但以降低平稳性为代价。到达每个位置需要很小的延迟。

for (pos = 0; pos <= 30; pos += 1) { // goes from 0 degrees to 30 degrees in steps of 1 degree
   myservo.write(pos);              // tell servo to go to position in variable 'pos'
   delay(15);                       // waits 15ms for the servo to reach the position
 }

同样,这种技术可在大多数伺服驱动项目中使用。

分选

色选机最后一个组成部分是颜色感应组件,为此使用了 Adafruit 的基于 TCS34725 的板卡。颜色感应是一个复杂的课题,该板卡配有多个可以计算色温的高级库,从而用于确定每个计数物的独特颜色。

SensorTest.ino 获得每种颜色的校准值并测试传感器。确保在一致的背景照明条件下进行此操作,因为传感器对照明变化非常敏感。实现色温到特定颜色的可靠映射是该项目最难的部分,可让您了解到为什么有些人患有色盲。

测试代码将每种颜色的最小和最大色温输出到 Arduino 串行监视器。该映射在最终代码中用于索引旋转盘的正确位置。

组装

现在,项目的每个部分都已进行了开发和测试,全部组合在 ColourSorter.ino 中。

我使用了 7 V 台式电源,这稍微超出了伺服电机的规格,但是没有问题。这意味着不需要额外的电路。

getIndex() 函数是这里的重要补充,它包含一系列 if 语句,为从传感器校准练习中获得的每个色温设定了界限。该函数的返回值是旋转盘针对该颜色的索引位置,用于驱动步进电动机。

if (colour > 3878 && colour <= 4183) {
   Serial.println("Yellow");
   return index = 1;
 }

回到未来

这个项目是学习控制步进电动机和伺服电动机以及对彩色物体分类的非常有趣的方式。这为其他机电一体化和机器人项目打下了非常好的基础。

这一项目的最大挑战是获得准确、一致的颜色读数,如果我要做进一步的改进,我可能会增加一个盘位来收集“不合格品”。这样,就有可能在色温映射中产生间隙,以获得该颜色的更严格容差。那么,任何未分类的计数物都可能被拒绝,然后再重新分类。

话虽如此,Arduino 色选机的准确率仍可达到 98%-99%。如果您有其他颜色分类方法的任何建议,请在下面评论。

对了,在创建色选机时,不要贪吃彩虹糖!

I'm a big Open Source fan and Linux aficionado with a penchant for Italian motorbikes

2 Oct 2018, 6:32