机械臂颜色识别案例

2023-11-17


大家好,我就是那个走在路上经常捡到宝的铁熊老师,那么今天捡到了啥好玩的东西呢?一台五自由度机械臂,从天而降出现在我面前!

这话说出口,我自己都不信,哪有那么好的运气!其实这是朋友送我玩的,你也想要这台机械臂么?什么!你不要机械臂,你想要那个朋友?那是不可能的!

既然白嫖了一台这么高端的机械臂,总是要玩点什么才对得起它!那就给它点颜色瞧瞧,让它以后乖乖听我话。那今天就来设计一个色块分拣机械臂的案例吧:通过颜色传感器,给机械臂增加颜色识别的能力,使其可以识别不同色块的颜色,然后将相同的色块摆放到一起。

在开始完整的教程之前,我们先来看一下效果演示视频:

朋友送我一台机械臂,你是要机械臂呢?还是要朋友?

机械臂介绍

首先我们来认识一下这台机械臂:它是一台五自由度机械臂,采用了 Arduino Uno 作为主控板,所有关节采用串行总线舵机进行控制,也就是只要一根信号线,就可以同时对机械臂上 5 个舵机进行控制,另外它还可以采用 Mixly 图形化编程。由于采用了 Arduino 主控,加上可以 DIY 的结构,所以它具有很强的开放性和扩展性,不仅可以无缝集成各种 Arduino 中常用的传感器,还可以改装结构,应用在各种项目中。

为了配合它特有的串行总线舵机控制,它还有专门的 Arduino 扩展板:Ardurobo1
Ardurobo1接口说明
Ardurobo1 主要具有如下功能特性:

  • 直接兼容 Arduino Uno 直插,无需其他连线;
  • 集成 6 路分布式串行总线通道,CH1~CH6,每个通道最多串联 6 个舵机,因此最多可以同时控制 36 个舵机;
  • 可直接调用预先编辑好的动作组;
  • 集成 I2C 接口、数字接口、模拟接口,兼容各种常用的传感器;
  • 为 Arduino 优化了电源管理,满足多个舵机同时工作的电源需求;
  • 提供电源反接保护,防止电源接线错误。

将 Ardurobo1 扩展板按照引脚对应关系直接插在 Arduino Uno 上即可完成连接,如下图所示:

颜色传感器介绍

由于这个项目涉及到色块分拣,也就是要先进行颜色识别,所以我们这里采用了颜色传感器,当然用其他可以识别颜色的传感器也是没有问题的,比如说图像识别传感器。这里我们先来介绍一下颜色传感器和它的使用方法。

颜色传感器有很多种型号,比如 TCS230、TCS34725 等,他们的使用方法基本类似。本项目中使用的颜色传感器型号为 TCS34725。

TCS34725 是一款低成本,高性价比的 RGB 全彩颜色传感器,传感器通过光学感应来识别物体的表面颜色。支持识别红、绿、蓝(R、G、B)三基色,可以输出对应的具体数值,帮助您还原颜色本真。

为了提高精度,防止周边环境干扰,一般会在传感器底部添加一块红外遮光片,最大程度减小了入射光的红外频谱成份,让颜色管理更加准确。板载自带了高亮LED,让传感器在低环境光的情况下依然能够正常使用,实现“补光”的功能。模块采用 I2C 通信,可以很方便的接到主控板上。

接下来我们就来学习一下在 Mixly 中如何编程实现颜色传感器识别颜色。

颜色传感器电路连接

我们把颜色识别传感器接在 Arduino Uno (或 Ardurobo1 扩展板)的 I2C 引脚,如下图所示:

读取 RGB 颜色值

Mixly 中有专门的 TCS34725 颜色传感器编程模块,它位于传感器分类中,它的作用是返回待识别颜色的 R(红色)、G(绿色)、B(蓝色)的值,然后我们再通过 R、G、B 值去分辨(分类)颜色。

我们来编写一个程序,分别获取不同颜色方块的 RGB 值,并且在串口中打印出 RGB 值,程序如下:

上传程序,打开串口监视器,观察不同颜色的方块,在串口监视器中的返回结果:

注意:环境光线、物体表面光滑度、传感器与待测物体,都会影响颜色传感器的识别结果,实际使用时,如果待测环境发生变化,请重新测量数值,并且尽量保持颜色识别传感器与待测表面保持相同的距离。

色块颜色分辨

观察上面返回的结果,我们可以发现:

  • 检测红色方块时,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 值判定方块的颜色:

上传程序,然后分别去检测每个方块,在串口监视器中查看返回的结果是否与实际方块颜色一致。

色块分拣机械臂

有了颜色传感器的使用基础,设计色块分拣机械臂项目就不难了。

机械臂电路连接

我们采用特制的防反接线,把颜色传感器接在 I2C 引脚,把点阵屏也接在 I2C 引脚,把机械臂上的舵机串联接在 CH2 通道上(或者其他 5 个通道都可以),如下图所示。这里增加点阵屏模块是为了显示识别到的颜色名称(缩写)。

场景搭建

接着根据视频中的演示效果,我们来搭建一个简单的场景。首先找一块白色泡沫,在正面中间位置开个孔、在背面挖个槽,将颜色安装到卡槽中,颜色传感器的识别芯片和 LED 灯光朝上,如下图所示:

在这里插入图片描述
然后找 4 个盒子,分别标上红色、绿色、蓝色、黄色字样,代表不同色块的分拣盒。

然后将机械臂、颜色传感器、分拣盒按下图所示方式摆放。

至此,色块分拣机械臂的简易场景搭建完成,下面开始机械臂动作设计与程序编写。

机械臂动作设计

一开始我觉得机械臂的抓取动作设计很麻烦,要一个舵机一个舵机去调节角度,要完成这么多抓取的动作,肯定要花费很长时间了。而且不同动作之间的路径与运动规划,那就更难了!结果朋友告诉我,它有个专门的动作编辑器软件,只要用手对给它凹凹造型,掰掰关节,然后用软件记录下来就可以了。有这么简单的方法,那还不赶紧试试!

这里动作编辑器软件的使用,就不详细展开了,反正很简单,如果后面使用这个机械臂的老师多的话,再专门写一篇动作编辑器的教程好了。

首先将机械臂与专门的动作编辑器软件通过串口连接的方式进行连接,然后利用凹造型的方式,设计一系列系列机械臂的动作。注意,这里每个动作实际上就代表机械臂的一种造型,可以让机械臂从任意位置运动到指定造型位置,这里的动作就类似编程时执行的不同语句。而不同造型之间的位置或动作切换,机械臂会自动生成顺滑的路径规划,完全不需要我们去计算角度。一个字,简单!真香!

色块分拣的不同动作设计如下,每个动作都可以让机械臂到达指定的一个位置,并且维持该状态。由于采用手动凹造型的方式进行动作设计的,所以这里的动作也不唯一,每个人可以根据自己的需求设计不同的动作位置。当然你也可以在手动凹造型之后,对每个舵机的角度进行精确调整,使得动作更加精确。

然后呢,有些任务或者动作之间可以组合在一起,将它们合并成一个动作组(软件中叫“宏”),这些组合在一起的动作,可以用来完成一些特定的任务,方便其他动作或者任务进行调用,这里的动作组就类似编程时的函数

色块分拣任务的不同动作组如下:

设置完动作组以后,需要生成动作组的定义,在软件中叫生成宏定义,其实就是给每个动作组生成一个编号,方便在 Mixly 编程或其他方式编程时进行调用:

可以点击复制,将这些宏定义暂时复制到一个文本文件中:

// 抓取方块
#define MACRO01 1337761498
// 分拣红色方块
#define MACRO02 1331656684
// 分拣绿色方块
#define MACRO03 420974790
// 分拣蓝色方块
#define MACRO04 390176801
// 分拣黄色方块
#define MACRO05 711367415

设计完机械臂的动作之后,就可以在 Mixly 中进行编程了。

Mixly 程序编写

首先来看一下这个机械臂对应的 Mixly 图形模块有哪些,如下图所示。实际上这些模块的功能,就是实现对舵机的各种控制方式。

而我们这个色块分拣项目的 Mixly 程序比较简单,只需对上面色块颜色分辨程序稍加修改即可:

  • 在初始化模块中,增加点阵屏初始化与 Ardurobo1 控制板(统称 DBSP 控制板)的初始化;
  • 点阵屏是用来显示识别到的颜色缩写,比如红色显示 R (Red)、绿色 G (Green)等;
  • 将串口打印颜色功能变成:点阵屏显示与执行对应颜色的分拣动作组(执行宏)。

这里特别提一下执行宏 编号模块,它的功能就是去调用机械臂不同的动作组,让机械臂完成特定的任务。我们可以对比一下程序中用到的宏编号,是不是和上面生成的宏定义编号一模一样?比如程序中分拣红色方块(程序中有注释)的编号为 1331656684;设计动作时,生成的分拣红色方块的宏定义编号也是 1331656684,完全一样!

有了执行宏 编号这个程序模块,在 Mixly 编程中就只需要去调用机械臂的动作或动作组就好了,就像调用函数一样简单,非常方便。

编写完 Mixly 程序后,上传到 Arduino 开发板中,就可以看到文章开头演示视频中的效果啦。

总结

今天的教程就到此结束。在这篇文章中,我们学习了颜色识别传感器的原理、接线方法与编程方式,另外还学习了如何利用颜色传感器去分辨不同的颜色。最后结合点阵屏模块,设计了一个色块分拣机械臂项目。由于这个机械臂集成了动作编辑器软件、以及 Mixly 图形化编程,因此使用起来是非常简单的,非常适合玩腻了各种智能小车的老师、同学来入门其他机器人项目,后面我也会在更多的项目中用到这个机械臂,一起来期待吧~

欢迎关注

最后,欢迎扫码关注公众号:铁熊玩创客,不定期更新创客制作、技术教程、创客教育等相关内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机械臂颜色识别案例 的相关文章

  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 3D点云检测神技 | UFO来了!让PointPillars、PV-RCNN统统涨点!

    作者 AI驾驶员 编辑 智驾实验室 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 3D目标检测 技术交流群 本文只做学术分享 如有侵权 联系删文 在这篇论文中提出了一个关于在3D点云中检测未
  • Arduino Nano 上的 WiFi

    我无法找到的虚拟问题 我用来将 WiFi 802 11b g n 添加到 Raspberry Pi 的扩展板也可以在 Nano 上使用吗 换句话说 向 Arduino Nano 板添加 WiFi 有多容易 可行 Thanks Arduino
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • Making Large Language Models Perform Better in Knowledge Graph Completion论文阅读

    文章目录 摘要 1 问题的提出 引出当前研究的不足与问题 KGC方法 LLM幻觉现象 解决方案 2 数据集和模型构建
  • Fedora 中的 Arduino 上传错误“stk500_recv(): 程序员没有响应”

    我正在尝试上传库存Blink在 Fedora Core 15 Linux 中使用 Arduino IDE 绘制草图 我收到此错误 avrdude stk500 recv 程序员没有响应 要重现该问题 通过 USB 线插入 Arduino U
  • Arduino I2S 正弦波

    我正在开发一个项目 我想通过组合不同的正弦波来生成 简单 声音 我使用的是 arduino mkrZero 因为它内置了 I2S 接口 并且似乎有足够的处理能力来满足我的需求 I have wired my system exactly l
  • DCF77 解码器与噪声信号

    我几乎完成了我的开源 DCF77 解码器项目 当我注意到标准 Arduino DCF77 库在噪声信号上表现非常差时 这一切就开始了 特别是当天线靠近计算机或洗衣机正在运行时 我永远无法从解码器中获取时间 我的第一个方法是向输入信号添加 数
  • Android BLE 扫描与 UUID 过滤器列表混淆

    我正在 Android 移动设备 A 上执行 UUID 过滤扫描 并且有两个测试用例 一个人在另一台 Android 设备 移动设备 b 上使用名为 BLE Scanner 的应用程序来创建具有两个测试服务 每个服务都有自己唯一的 UUID
  • 终止导致设备或资源繁忙的进程:“/dev/ttyUSB0”?

    我使用以下 Python 代码连接到我的 Arduino 板 device glob glob dev ttyUSB 0 time sleep 1 arduino serial Serial device 115200 timeout 5
  • Arduino 的 C++ 类文件中的字符串无法编译

    我正在用 C 为 Arduino 编写一个堆栈类sketch http www arduino cc en Tutorial Sketch 我相信它完全符合AVR 如果这就是它的名字 我记不清了 编译器 我都用过malloc and fre
  • HM10 ble改变特征值AT命令Arduino

    谁能帮我用AT命令写入特征值 或者如何使用Hm10模块将数据从arduino发送到另一个ble设备 HM10发送AT START后 会通告数据包 并且可以检测服务和特征 但特征值是默认的0x00 如何更改 多次检查数据表 但找不到能够执行相
  • Arduino:连接字符串时崩溃和错误

    我尝试将 AES 256 加密的输出连接到一个字符串 将此字符串与从 Android 手机发送的加密字符串进行比较 基本上 连接似乎有效 但在几次运行后会出现错误 不可读的字符 字符串变得更短而不是更长 或崩溃 它是可重现的 重启后在同一点
  • 如何为 Arduino 或类似的微控制器编写 JavaScript 编译器? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我意识到这个问题会引起一些人的注意 并且我意识到 JavaScript 传统上是一种解释性语言 请让我解释一下 我是一名专门从事 We
  • 在 Arduino 上将整数/小数转换为十六进制?

    如何将整数或小数变量转换为十六进制字符串 我可以做相反的事情 将十六进制转换为整数 但我无法找出其他方法 这是为了Serial print 数组中的十六进制值 查看 Arduino 字符串教程here http arduino cc en
  • 通过iPhone音频插孔读取数据

    我正在寻找一种方法来读取通过 iPhone 的音频插孔从 Arduino 发送的原始数据 我搜索了很多并发现this https github com sanjibahmad Is Headphone Plugged In tree mas
  • 编译器:如果条件始终为真/假怎么办

    我想到了条件和编译器 我正在为 Arduino 编写一个应用程序 因此我需要该应用程序尽可能快 在我的代码中我有这个 define DEBUG false if DEBUG String pinName pinName Pin pinNam
  • Arduino串口数据解析

    我正在编写一个应用程序 通过蓝牙用我的 Android 手机控制我的机器人 一切都很顺利 数据得到回显和验证 但我在协议方面遇到了一些问题 特别是我希望我的机器人的轮子在我发送时转动一个命令 例如s 10 100 or s 30 10 数值
  • 在链接时合并全局数组/从多个编译单元填充全局数组

    我想定义一系列的东西 比如事件处理程序 的内容 该数组在编译时是完全已知的 但定义在 多个编译单元 分布在多个库中 至少在最终 静态 链接之前是相当解耦的 我想要 也保持这种方式 因此添加或删除编译单元将 还可以自动管理事件处理程序 而无需

随机推荐

  • Qt实现引导界面UITour

    介绍 最近做了一款键鼠自动化 想第一次安装打开后搞一个引导界面 找了好多资料没啥参考 偶然发现qt有引导界面如下图 Qt整挺好 但是未找到源码 真的不想手撸 源码找到了但是Qt整起来太复杂 没法拿来直接用 还是得撸 地地址 下图是仿照qt实
  • sql行转列三个方法

    1 行转列sum if case when 由多行变一行 group by聚合 由一列变多列 衍生提前 select uid sum if course 语文 score NULL as 语文 sum if course 数学 score
  • [网络安全自学篇] 八十八.基于机器学习的恶意代码检测技术详解

    这是作者网络安全自学教程系列 主要是关于安全工具和实践操作的在线笔记 特分享出来与博友们学习 希望您喜欢 一起进步 前文分享了传统的恶意代码检测技术 包括恶意代码检测的对象和策略 特征值检测技术 校验和检测技术 启发式扫描技术 虚拟机检测技
  • 服务器网站iis如何关闭,IIS7如何关闭WebDAV扩展服务

    在上一篇文章中 介绍了开启WebDAV扩展服务的危害性 必须关闭 不过那篇文章是针对IIS6 0的配置 对于IIS7来说 道理也是一样的 一般网站无需用到WebDAV扩展服务 强烈建议关闭 那么IIS7如何关闭WebDAV扩展服务呢 其实方
  • element-plus Vue 3.0 Beta来了

    GitHub地址 ElementUi Beta版本文档 又要秃头一波了
  • 学渣的刷题之旅 leetcode刷题 14.最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 输入 flower flow flight 输出 fl 示例 2 输入 dog racecar car 输出 解释 输入不存在公共前缀 说明 所有输入只包含小写
  • 设计模式(八)----创建型模式之建造者模式与工厂模式区别

    1 工厂方法模式VS建造者模式 工厂方法模式注重的是整体对象的创建方式 而建造者模式注重的是部件构建的过程 意在通过一步一步地精确构造创建出一个复杂的对象 我们举个简单例子来说明两者的差异 如要制造一个超人 如果使用工厂方法模式 直接产生出
  • The package needs to be reinstalled,but I can't find an archive for it

    转自 http cache baiducontent com c m 9d78d513d99456ae28fa950d1a16a620430397634d9583442687c61f84642a1d1031b5fa302261428ed27
  • 云网络丢包故障定位

    引言 本期分享一个比较常见的 络问题 丢包 例如我们去 Ping 个 站 如果能 Ping 通 且 站返回信息全 则说明与 站服务器的通信是畅通的 如果 Ping 不通 或者 站返回的信息不全等 则很可能是数据被丢包了 类似情况想必 家都不
  • 2019年数学建模国赛A题

    前几天中秋节比完了 选的A题 我们学校好多组都选了A题 C题的很少 大家都怕找不到数据 我们组刚开始觉得A B都能做 就是C题可能没有数据无法下手 加上之前做小区道路的时候 用了仿真软件解题 我觉得很不靠谱 我主要是写论文的 然后一起建了数
  • WSUS服务器的详细配置和部署-转载

    WSUS服务器的详细配置和部署 一 WSUS 安装要求1 硬件要求 对于多达 500 个客户端的服务器 建议使用以下硬件 1 GHz 的处理器 1 GB 的 RAM2 软件要求 要使用默认选项安装 WSUS 必须在计算机上安装以下软件 Mi
  • 西瓜+南瓜-task1 模型评估与选择

    题外话 南瓜书是西瓜书公式的进一步深入 机器学习研究什么 对历史经验的归纳总结 预测 比如 早霞不出门晚霞行千里 通过历史累计 经验 预测第二天是晴天还是雨天 此处的 经验 类似于历史数据 通过学习数据 或者训练数据 提前预判 这就是机器学
  • 详细版mongodb下载安装教程----windows版

    一 详细下载过程 1 官网选择需要的版本 Download MongoDB Community Server MongoDB 2 然后得到这个 双击它 3 打开第一个就是这个界面 点next即可 4 第二个界面 点同意 点next 5 点c
  • 世界杯十大巨星

    随着南非世界杯开幕日期一天天临近 近日 英媒 泰晤士报 评选出了世界杯历史上10名最伟大的球星 马拉多纳力压贝利排名榜首 现役球员中 仅罗纳尔多入选并排名第八 一 马拉多纳 在这个地球上 几乎没有球员 可以让其职业生涯 甚至人生 在短短3分
  • 数字万用表的使用

    参考 连3岁小孩子都能看懂的万用表使用方法 地址 https www bilibili com video BV1Gx411z7x2 p 1 vd source cc0e43b449de7e8663ca1f89dd5fea7d 目录 万用表
  • IDEA中使用UT测试过程中的一些小问题

    当查看代码覆盖率结果 快捷键Ctrl Alt F6 当运行测试查看代码覆盖率的时候 出现如下图所示的界面 No coverage results Click Edit to fix configuration settings 解决办法就是
  • 【区块链学习】Merkle Patricia Tree (MPT) 以太坊中的默克尔树

    本篇博文是自己学习mpt的过程 边学边记录 很多原理性内容非自己原创 好的博文将会以链接形式进行共享 一 什么是mpt MPT是以太坊中的merkle改进树 基于基数树 即前缀树改进而来 大大提高了查找效率 二 前缀树 MPT中的P 就是前
  • Linux 中的 cd 命令及示例

    cd命令在Linux 中称为更改目录命令 它用于有效地从当前工作目录移动到系统中的不同目录 Linux 中 cd 命令的语法 光盘 目录 cd directory 在这里 将 directory 替换为您要导航到的目标目录的路径 cd 命令
  • STM32的I/O口的8种工作模式

    转自http www openedv com posts list 21980 htm 浮空 顾名思义就是浮在空中 上面用绳子一拉就上去了 下面用绳子一拉就沉下去了 开漏 就等于输出口接了个NPN三极管 并且只接了e b c极 是开路的 你
  • 机械臂颜色识别案例

    大家好 我就是那个走在路上经常捡到宝的铁熊老师 那么今天捡到了啥好玩的东西呢 一台五自由度机械臂 从天而降出现在我面前 这话说出口 我自己都不信 哪有那么好的运气 其实这是朋友送我玩的 你也想要这台机械臂么 什么 你不要机械臂 你想要那个朋