电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
机械臂颜色识别案例 | 路上捡到一台机械臂,给它点颜色瞧瞧?
分 享
扫描二维码分享
机械臂颜色识别案例 | 路上捡到一台机械臂,给它点颜色瞧瞧?
机械臂
arduino
人工智能
铁熊
关注
发布时间: 2020-08-25
丨
阅读: 1082
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvd2VpLXhpbi1mZW5nLW1pYW4ucG5n?x-oss-process=image/format,png) 大家好,我就是那个走在路上经常捡到宝的`铁熊`老师,那么今天捡到了啥好玩的东西呢?一台五自由度机械臂,从天而降出现在我面前! 这话说出口,我自己都不信,哪有那么好的运气!其实这是朋友送我玩的,你也想要这台机械臂么?什么!你不要机械臂,你想要那个朋友?那是不可能的! ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvamkteGllLWJpLXhpYW8tZ3VvLXR1Mi5wbmc?x-oss-process=image/format,png) 既然白嫖了一台这么高端的机械臂,总是要玩点什么才对得起它!那就给它点颜色瞧瞧,让它以后乖乖听我话。那今天就来设计一个`色块分拣机械臂`的案例吧:通过颜色传感器,给机械臂增加颜色识别的能力,使其可以识别不同色块的颜色,然后将相同的色块摆放到一起。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMveWFuLXNlLXNoaS1iaWUtamkteGllLWJpLnBuZw?x-oss-process=image/format,png) 在开始完整的教程之前,我们先来看一下效果演示视频(点击链接查看演示视频): https://www.bilibili.com/video/BV1q64y1c7n5/ # 机械臂介绍 首先我们来认识一下这台机械臂:它是一台五自由度机械臂,采用了 Arduino Uno 作为主控板,所有关节采用串行总线舵机进行控制,也就是只要一根信号线,就可以同时对机械臂上 5 个舵机进行控制,另外它还可以采用 Mixly 图形化编程。由于采用了 Arduino 主控,加上可以 DIY 的结构,所以它具有很强的开放性和扩展性,不仅可以无缝集成各种 Arduino 中常用的传感器,还可以改装结构,应用在各种项目中。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvd2FpLWd1YW4tc2h1by1taW5nLmpwZw?x-oss-process=image/format,png) 为了配合它特有的串行总线舵机控制,它还有专门的 Arduino 扩展板:`Ardurobo1`。 ![Ardurobo1接口说明](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvYXJkdXJvYm8xamllLWtvdS1zaHVvLW1pbmcucG5n?x-oss-process=image/format,png) Ardurobo1 主要具有如下功能特性: - 直接兼容 Arduino Uno 直插,无需其他连线; - 集成 6 路分布式串行总线通道,CH1~CH6,每个通道最多串联 6 个舵机,因此最多可以同时控制 36 个舵机; - 可直接调用预先编辑好的动作组; - 集成 I2C 接口、数字接口、模拟接口,兼容各种常用的传感器; - 为 Arduino 优化了电源管理,满足多个舵机同时工作的电源需求; - 提供电源反接保护,防止电源接线错误。 将 Ardurobo1 扩展板按照引脚对应关系直接插在 Arduino Uno 上即可完成连接,如下图所示: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvYXJkdWluby15dWFyZHVyb2JvMWxpYW4tamllLnBuZw?x-oss-process=image/format,png) # 颜色传感器介绍 由于这个项目涉及到色块分拣,也就是要先进行颜色识别,所以我们这里采用了颜色传感器,当然用其他可以识别颜色的传感器也是没有问题的,比如说图像识别传感器。这里我们先来介绍一下颜色传感器和它的使用方法。 颜色传感器有很多种型号,比如 TCS230、TCS34725 等,他们的使用方法基本类似。本项目中使用的颜色传感器型号为 TCS34725。 TCS34725 是一款低成本,高性价比的 RGB 全彩颜色传感器,传感器通过光学感应来识别物体的表面颜色。支持识别红、绿、蓝(R、G、B)三基色,可以输出对应的具体数值,帮助您还原颜色本真。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMveWFuLXNlLXNoaS1iaWUtY2h1YW4tZ2FuLXFpLXl1YW4tbGkucG5n?x-oss-process=image/format,png) 为了提高精度,防止周边环境干扰,一般会在传感器底部添加一块红外遮光片,最大程度减小了入射光的红外频谱成份,让颜色管理更加准确。板载自带了高亮LED,让传感器在低环境光的情况下依然能够正常使用,实现“补光”的功能。模块采用 I2C 通信,可以很方便的接到主控板上。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvdGNzMzQ3MjV5YW4tc2Utc2hpLWJpZS1jaHVhbi1nYW4tcWkteGlhby1ndW8tdHUucG5n?x-oss-process=image/format,png) 接下来我们就来学习一下在 Mixly 中如何编程实现颜色传感器识别颜色。 ### 颜色传感器电路连接 我们把颜色识别传感器接在 Arduino Uno (或 Ardurobo1 扩展板)的 I2C 引脚,如下图所示: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMveWFuLXNlLXNoaS1iaWUtY2h1YW4tZ2FuLXFpLWppZS14aWFuLXR1LnBuZw?x-oss-process=image/format,png) ### 读取 RGB 颜色值 Mixly 中有专门的 **TCS34725 颜色传感器**编程模块,它位于`传感器`分类中,它的作用是返回待识别颜色的 R(红色)、G(绿色)、B(蓝色)的值,然后我们再通过 R、G、B 值去分辨(分类)颜色。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvdGNzMzQ3MjV5YW4tc2Utc2hpLWJpZS1tby1rdWFpLnBuZw?x-oss-process=image/format,png) 我们来编写一个程序,分别获取不同颜色方块的 RGB 值,并且在串口中打印出 RGB 值,程序如下: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvZHUtcXUteWFuLXNlcmdiLXpoaS1jaGVuZy14dS5wbmc?x-oss-process=image/format,png) 上传程序,打开串口监视器,观察不同颜色的方块,在串口监视器中的返回结果: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvYnUtdG9uZy1zZS1rdWFpcmdiLWZhbi1odWktemhpLnBuZw?x-oss-process=image/format,png) > 注意:环境光线、物体表面光滑度、传感器与待测物体,都会影响颜色传感器的识别结果,实际使用时,如果待测环境发生变化,请重新测量数值,并且尽量保持颜色识别传感器与待测表面保持相同的距离。 ### 色块颜色分辨 观察上面返回的结果,我们可以发现: - 检测**红色**方块时,R 值相对较大(R > 60),G、B 值相对较小(G < 10,B < 10); - 检测**绿色**方块时,G 值相对较大(G > 30),R、B 值相对较小(R < 10,B < 10); - 检测**蓝色**方块时,B 值相对较大(B > 40),R、G 值相对较小(R < 10,B < 20); - 检测**黄色**方块时,R、G 值相对较大(R > 20,G > 20),B 值相对较小(B < 10)。 根据这个结果,我们进行一下推理分类,在检测 4 色方块场景中,可以判定: - 当 R > 60 时,检测到的方块为红色; - 当 G > 30 时,检测到的方块为绿色; - 当 B > 40 时,检测到的方块为蓝色; - 当 R > 20 且 G > 20 时,检测到的方块为黄色。 > 注意:在设定 RGB 颜色边界范围时,我们要仔细观察每个颜色的数值范围,使设定的 RGB 边界值可以保持每种色块的唯一性,这样可以大大简化程序。如果两种颜色的边界值比较接近,则可能需要多重判断,分别去判断 RGB 值。所以在进行颜色识别实验中,尽可能挑选差异比较明显的颜色。 根据上述推理,编写程序,根据检测到的 RGB 值判定方块的颜色: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvc2Uta3VhaS15YW4tc2UtZmVuLWJpYW4tY2hlbmcteHUucG5n?x-oss-process=image/format,png) 上传程序,然后分别去检测每个方块,在串口监视器中查看返回的结果是否与实际方块颜色一致。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvc2ktc2UtZmFuZy1rdWFpLWppYW4tY2UucG5n?x-oss-process=image/format,png) # 色块分拣机械臂 有了颜色传感器的使用基础,设计色块分拣机械臂项目就不难了。 ### 机械臂电路连接 我们采用特制的防反接线,把颜色传感器接在 I2C 引脚,把点阵屏也接在 I2C 引脚,把机械臂上的舵机串联接在 CH2 通道上(或者其他 5 个通道都可以),如下图所示。这里增加点阵屏模块是为了显示识别到的颜色名称(缩写)。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvc2Uta3VhaS1mZW4tamlhbi1qaS14aWUtYmktZGlhbi1sdS10dS5wbmc?x-oss-process=image/format,png) ### 场景搭建 接着根据视频中的演示效果,我们来搭建一个简单的场景。首先找一块白色泡沫,在正面中间位置开个孔、在背面挖个槽,将颜色安装到卡槽中,颜色传感器的识别芯片和 LED 灯光朝上,如下图所示: ![在这里插入图片描述](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvYW4temh1YW5nLXlhbi1zZS1jaHVhbi1nYW4tcWkucG5n?x-oss-process=image/format,png) 然后找 4 个盒子,分别标上红色、绿色、蓝色、黄色字样,代表不同色块的分拣盒。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvZmVuLWppYW4taGUuanBn?x-oss-process=image/format,png) 然后将机械臂、颜色传感器、分拣盒按下图所示方式摆放。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvYmFpLWZhbmcteGlhby1ndW8uanBn?x-oss-process=image/format,png) 至此,色块分拣机械臂的简易场景搭建完成,下面开始机械臂动作设计与程序编写。 ### 机械臂动作设计 一开始我觉得机械臂的抓取动作设计很麻烦,要一个舵机一个舵机去调节角度,要完成这么多抓取的动作,肯定要花费很长时间了。而且不同动作之间的路径与运动规划,那就更难了!结果朋友告诉我,**它有个专门的动作编辑器软件,只要用手对给它凹凹造型,掰掰关节,然后用软件记录下来就可以了**。有这么简单的方法,那还不赶紧试试! 这里动作编辑器软件的使用,就不详细展开了,反正很简单,如果后面使用这个机械臂的老师多的话,再专门写一篇动作编辑器的教程好了。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvZG9uZy16dW8tYmlhbi1qaS1xaS1ydWFuLWppYW4ucG5n?x-oss-process=image/format,png) 首先将机械臂与专门的动作编辑器软件通过串口连接的方式进行连接,然后利用凹造型的方式,设计一系列系列机械臂的动作。注意,这里每个动作实际上就代表机械臂的一种造型,可以让机械臂从任意位置运动到指定造型位置,**这里的动作就类似编程时执行的不同语句**。而**不同造型之间的位置或动作切换,机械臂会自动生成顺滑的路径规划,完全不需要我们去计算角度**。一个字,简单!真香! 色块分拣的不同动作设计如下,每个动作都可以让机械臂到达指定的一个位置,并且维持该状态。由于采用手动凹造型的方式进行动作设计的,所以这里的动作也不唯一,每个人可以根据自己的需求设计不同的动作位置。当然你也可以在手动凹造型之后,对每个舵机的角度进行精确调整,使得动作更加精确。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvamkteGllLWJpLWRvbmctenVvLXNoZS1qaS5wbmc?x-oss-process=image/format,png) 然后呢,有些任务或者动作之间可以组合在一起,将它们合并成一个动作组(软件中叫“宏”),这些组合在一起的动作,可以用来完成一些特定的任务,方便其他动作或者任务进行调用,**这里的动作组就类似编程时的函数**。 色块分拣任务的不同动作组如下: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvemh1YS1xdS1mYW5nLWt1YWktZG9uZy16dW8tenUucG5n?x-oss-process=image/format,png) 设置完动作组以后,需要生成动作组的定义,在软件中叫`生成宏定义`,其实就是给每个动作组生成一个编号,方便在 Mixly 编程或其他方式编程时进行调用: ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvc2hlbmctY2hlbmctaG9uZy1kaW5nLXlpLnBuZw?x-oss-process=image/format,png) 可以点击复制,将这些宏定义暂时复制到一个文本文件中: ```c // 抓取方块 #define MACRO01 1337761498 // 分拣红色方块 #define MACRO02 1331656684 // 分拣绿色方块 #define MACRO03 420974790 // 分拣蓝色方块 #define MACRO04 390176801 // 分拣黄色方块 #define MACRO05 711367415 ``` 设计完机械臂的动作之后,就可以在 Mixly 中进行编程了。 ### Mixly 程序编写 首先来看一下这个机械臂对应的 Mixly 图形模块有哪些,如下图所示。实际上这些模块的功能,就是实现对舵机的各种控制方式。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvZGJzcG1peGx5LWt1LnBuZw?x-oss-process=image/format,png) 而我们这个色块分拣项目的 Mixly 程序比较简单,只需对上面**色块颜色分辨**程序稍加修改即可: - 在初始化模块中,增加点阵屏初始化与 Ardurobo1 控制板(统称 DBSP 控制板)的初始化; - 点阵屏是用来显示识别到的颜色缩写,比如红色显示 R (Red)、绿色 G (Green)等; - 将串口打印颜色功能变成:点阵屏显示与执行对应颜色的分拣动作组(执行宏)。 这里特别提一下`执行宏 编号`模块,它的功能就是去调用机械臂不同的动作组,让机械臂完成特定的任务。我们可以对比一下程序中用到的宏编号,是不是和上面生成的宏定义编号一模一样?比如程序中分拣红色方块(程序中有注释)的编号为 1331656684;设计动作时,生成的分拣红色方块的宏定义编号也是 1331656684,完全一样! 有了**执行宏 编号**这个程序模块,在 Mixly 编程中就只需要去调用机械臂的动作或动作组就好了,就像调用函数一样简单,非常方便。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvc2Uta3VhaS1mZW4tamlhbi1qaS14aWUtYmktY2hlbmcteHUucG5n?x-oss-process=image/format,png) 编写完 Mixly 程序后,上传到 Arduino 开发板中,就可以看到文章开头演示视频中的效果啦。 ## 总结 今天的教程就到此结束。在这篇文章中,我们学习了颜色识别传感器的原理、接线方法与编程方式,另外还学习了如何利用颜色传感器去分辨不同的颜色。最后结合点阵屏模块,设计了一个色块分拣机械臂项目。由于这个机械臂集成了动作编辑器软件、以及 Mixly 图形化编程,因此使用起来是非常简单的,非常适合玩腻了各种智能小车的老师、同学来入门其他机器人项目,后面我也会在更多的项目中用到这个机械臂,一起来期待吧~ ## 欢迎关注 最后,欢迎扫码关注公众号:铁熊玩创客,不定期更新创客制作、技术教程、创客教育等相关内容。 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pcm9ucGFuZGEtMTI1OTc4MTExNS5jb3MuYXAtc2hhbmdoYWkubXlxY2xvdWQuY29tLzIwMjAtMDgtMjMvd2VpLXhpbi1lci13ZWktbWEteWluLWRhbzIucG5n?x-oss-process=image/format,png)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
铁熊
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交