Arduino实现简易颜色识别机械臂

机械臂

  • 一 功能原理
    • 1 硬件设备
    • 2 arduino库
    • 3 工作原理
  • 二 代码设计
    • 全局参数
    • 1 颜色识别
    • 2 机械臂转动
    • 3 机械臂复位
  • 三 展示效果

一 功能原理

识别出不同颜色的物体,让机械臂进行夹取并放入不同位置。

1 硬件设备

2 arduino库

3 工作原理


二 代码设计

  • 项目重点划分为三部分:颜色识别,机械臂抓取,机械臂复位。分别如下:

全局参数

#include <Servo.h>
#include "Wire.h"
#include <Adafruit_TCS34725.h>int pos1 = 0;  //各舵机角度初始角度值
int pos2 = 90;
int pos3 = 90; 
int pos4 = 90;
int pos5 = 0;
int speed = 20;//机械手速度,全局调控
int step = 1;//模拟舵机转动度数//创建舵机对象
Servo myservo1;//base:基座舵机
Servo myservo2;//big_arm:大臂舵机
Servo myservo3;//fore_arm:小臂舵机
Servo myservo4;//top:顶部舵机
Servo myservo5;//paw:爪子舵机//初始化颜色传感器对象tcs,相关参数参阅: https://learn.adafruit.com/adafruit-color-sensors/program-it
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X);//在setup中初始设定舵机引脚,舵机初始角度,波特率,颜色判定等等....,略

1 颜色识别

/*
循环执行颜色判定,对于不同的颜色,串口输出不同的提示
并在检测到不同颜色时,调用对应的方法实现不同的动作。
*/
void loop() {// 传感器返回 R、G、B 的值uint16_t clearcol, red, green, blue;float average, r, g, b;delay(100);  //颜色测量需要大约50mstcs.getRawData(&red, &green, &blue, &clearcol);// 我写了5种颜色,分别是红色 棕色 蓝色  绿色 和黄色// 求 RGB 的平均值average = (red + green + blue) / 3;r = red / average;g = green / average;b = blue / average;//串口输出//R  G B的平均值应该在0.5-1.5之间,如果检测到红色,则R应高于1.0,G B在0.5-1.0之间,Serial.print("\tClear:");Serial.print(clearcol);Serial.print("\tRed:");Serial.print(r);Serial.print("\tGreen:");Serial.print(g);Serial.print("\tBlue:");Serial.print(b);/*
通过上面的串口输出,我们可以把颜色放在颜色传感器去检测,
然后确定RGB的取值范围,就可以确定不同颜色的值,对应不
同的舵机角度了
*/if ((r > 1.4) && (g < 0.9) && (b < 0.9)) {Serial.print("\t红色");catchs(60);} else if ((r < 0.95) && (g > 1.4) && (b < 0.9)) {Serial.print("\t绿色");//green();} else if ((r < 0.8) && (g < 1.2) && (b > 1.2)) {Serial.print("\t蓝色");catchs(120);}else if ((r > 1.15) && (g > 1.15) && (b < 0.7)) {Serial.print("\t黄色");catchs(90);} else if ((r < 0.95) && (g > 1.1) && (b < 0.9)) {Serial.print("\t棕色");//brown();}// 当颜色符合上述的颜色else {Serial.print("\t未检测到红-棕-绿-蓝-黄");// myservo.write(nonePos);}Serial.println("");delay(100);
}

2 机械臂转动

机械臂的完整抓取过程可提取为:
下放大小顶臂接近物体—>夹取—>抬高大臂—>旋转—>下方大臂—>送爪—>复位。
其中不同颜色对应动作的不同之处仅仅在于底座舵机旋转角度,故可设置一个通用的夹取函数,内置形参表示旋转角度即可。多种颜色一个函数全部实现,精简明了。

拓展:可改进为联动执行,需要运动学逆向受力分析,建立数学模型求解三元一次方程组。这样就可以根据末端舵机的状态,去计算出其他舵机需要达到的角度,实现多个舵机联动的目的,效果更加丝滑流畅。

/*
机械臂抓取函数,spin为旋转度数,不同颜色,设置不同度数
多种颜色的抓取动作,只有旋转角度不同,一个函数全部搞定
注:参数未详细调整,仅做参考。另外不同舵机转动范围可能不同,必须先验证自己舵机的角度范围与转动方向
*/
void catchs(int spin) {//1 下放大臂小臂和顶部舵机for (pos2 = 90; pos2 <= 120; pos2 += 1) {myservo2.write(pos2);delay(speed);}for (pos3 = 90; pos3 >= 60; pos3 -= 1) {myservo3.write(pos3);delay(speed);}for (pos4 = 90; pos4 >= 60; pos4 -= 1) {myservo4.write(pos4);delay(speed);}//2 夹取物品// 3 仅抬起大臂,调转方向for (pos2 = 120; pos2 >= 90; pos2 -= 1) {myservo2.write(pos2);delay(speed);}for(int i=0;i<spin;i++){   //转动spin度,spin不同颜色可以手动设置转动区间myservo1.write(pos1++);delay(speed);} //4 大臂下放for (pos2 = 90; pos2 <= 120; pos2 += 1) {myservo2.write(pos2);delay(speed);}//5 松爪init_pos();//机械臂流畅复位
}

3 机械臂复位

用于机械臂一套夹取动作结束后,执行复位。不需要为每一个动作单独编写复位代码,使用servo库中read()方法能够读取舵机角度,从而实现舵机通用角度的复位效果。

/*
读取舵机角度参数,控制舵机丝滑流畅的回到初始位置
如果不想丝滑,直接4行myservo.write(x),各舵机咻咻咻咻的就回去了
*/
void init_pos(){pos1=myservo1.read();  //读取当前各舵机角度值pos2=myservo2.read();  //注意:read函数只能读取对应舵机上一次write的数值pos3=myservo3.read();  //不支持及时读取,因为本项目使用的for循环不停的write角度,故可读取到上一次的角度pos4=myservo4.read();//pos5=myservo5.read();//爪子初始应该是打开状态;for(int i=pos1;i>=0;i-=step){  //1号舵机,归位0,逆时针移动,范围[0°,180°],0在右myservo1.write(i);delay(speed);}//myservo1.write(0);//设置step时,杜绝误差for(int i=pos2;i>=90;i-=step){   //2号舵机,归位90,顺时针移动,范围[90°,180°],0°在左myservo2.write(i);delay(speed);}if(pos2<90){                 //处理2号机在[0°,90°]时,2号机为大臂比较重要,所有情况全部判断for(int i=pos2;i<=90;i+=step){myservo2.write(i);delay(speed);}}//myservo2.write(90);//如果设置step时,杜绝误差for(int i=pos3;i<=90;i+=step){    //3号舵机,归位90°,逆时针移动,范围[0°,90°],0°在右myservo3.write(i);delay(speed);}if(pos3>90){for(int i=pos3;i>=90;i-=step){    //处理3号机在[90°,180°]时myservo3.write(i);delay(speed);}}//myservo3.write(90);//如果设置step时,杜绝误差for(int i=pos4;i<=90;i+=step){    //4号舵机,归位90°,逆时针移动,范围[0°,90°],0°在右myservo4.write(i);delay(speed);}  //处理4号机在[90°,180°]时if(pos4>90){for(int i=pos4;i>=90;i-=step){    //处理3号机在[90°,180°]时myservo4.write(i);delay(speed);}}//myservo4.write(90);//如果设置step时,杜绝误差//更新pos,可以将本函数中所有的i换成对应pos变量,此处就不用更新,但我觉得不如写i码量更短,哈哈哈pos1=0;pos2=90;pos3=90;pos4=90;}

三 展示效果

颜色识别机械臂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/617595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 SwiftUI 中实现音频图表

文章目录 前言DataPoint 结构体BarChartView 结构体ContentView 结构体实现协议实现线图总结 前言 在可访问性方面&#xff0c;图表是复杂的事物之一。iOS 15 引入了一项名为“音频图表”的新功能。 下面我们将学习如何通过使用 accessibilityChartDescriptor 视图修饰符为任…

用友NC Cloud IUpdateService接口存在XXE漏洞

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 用友NC 简介 微信公众号搜索:南风漏洞复现文库 该…

Shutter Encoder多媒体转换v17.8

软件介绍 多媒体包含种类繁多的各种文件格式&#xff0c;每种格式都有其不同的特征和所谓的“怪癖”。 因此&#xff0c;如果使用多种图像、视频或音频格式&#xff0c;找到一个集中的软件来从一个地方处理所有这些格式可能会非常棘手。 这就是 Shutter Encoder 基本上允许做的…

Go语言使用gosseract 库来进行图像文字识别,识别出来的中文是乱码的?如何解决?

如果您在使用 gosseract 库进行图像文字识别时&#xff0c;得到的中文文字是乱码&#xff0c;可能是因为默认情况下 gosseract 以及 Tesseract 引擎并不支持中文字符的识别。要解决这个问题&#xff0c;您需要进行一些配置和设置。 以下是解决方案的步骤&#xff1a; 1 安装 …

【算法】信使(最短路问题)

题目 战争时期&#xff0c;前线有 n 个哨所&#xff0c;每个哨所可能会与其他若干个哨所之间有通信联系。 信使负责在哨所之间传递信息&#xff0c;当然&#xff0c;这是要花费一定时间的&#xff08;以天为单位&#xff09;。 指挥部设在第一个哨所。 当指挥部下达一个命令…

硬盘重新分区怎么恢复分区之前的文件?

分区是常见的故障&#xff0c;通常由多种原因引起。一方面&#xff0c;硬盘老化或者受到损坏可能会导致分区表出现问题&#xff1b;另一方面&#xff0c;用户误操作&#xff0c;如格式化或分区不当&#xff0c;也可能导致分区丢失。针对此问题&#xff0c;解决方法包括使用专业…

代码仓库gitlab的数据迁移步骤

GitLab数据迁移的具体方法和详细操作如下&#xff1a; 备份源GitLab服务器的数据&#xff1a;你可以使用GitLab自带的备份工具进行备份&#xff0c;执行以下命令进行备份&#xff1a; sudo gitlab-rake gitlab:backup:create安装新的GitLab服务器&#xff1a;在目标服务器上安装…

# C++系列-第3章循环结构-28-累加

在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 累加 奥运奖牌计数 题目描述 2008 2008 2008 年北京奥运会&#xff0c;A 国的运动员参与了 n n n 天的决赛项目 ( 1 ≤ n ≤ 100 ) (1 \le n \le 100) (1≤n≤100)。现在要统计一下 A 国所获得的…

虚拟机连接(与主机断开连接)U盘的按钮为灰色之解决方法

在WIN11中&#xff0c;虚拟机“连接(与主机断开连接)U盘”选项为灰色&#xff0c;解决方法如下&#xff1a; 1、关闭虚拟机电源&#xff0c;得到下面的界面&#xff1a; 2、根据上述提示&#xff0c;找到虚拟机所在磁盘 3、配置文件属性见下图&#xff1a; 4、使用记事本打开…

JVM工作原理与实战(十四):JDK9及之后的类加载器

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、JDK8及之前的类加载器 二、JDK9及之后的类加载器 1.启动类加载器 2.平台类加载器&#xff08;扩展类加载器&#xff09; 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负…

华为OD机试 - 最长子字符串的长度(二)(Java JS Python C)

题目描述 给你一个字符串 s,字符串 s 首尾相连成一个环形,请你在环中找出 l、o、x 字符都恰好出现了偶数次最长子字符串的长度。 输入描述 输入是一串小写的字母组成的字符串 输出描述 输出是一个整数 备注 1 ≤ s.length ≤ 5 * 10^5s 只包含小写英文字母用例 输入alolob…

《设计模式的艺术》笔记 - 简单工厂模式

介绍 定义一个工厂类&#xff0c;它可以根据参数的不同返回不同类的实例&#xff0c;被创建的实例通常都具有相同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法&#xff0c;因此简单工厂模式又被称为静态工厂方法模式&#xff0c;属于类创建型模式 实现 class Pr…

Nginx——基础配置

和大多数软件一样&#xff0c;Nginx也有自己的配置文件&#xff0c;但它又有很多与众不同的地方&#xff0c;本帖就来揭开Nginx基础配置的面纱。 1、Nginx指令和指令块 了解指令和指令块有助于大家了解配置的上下文&#xff0c;下面是一个配置模板示例&#xff1a; 在这个配…

ElasticSearch 7.x 版本使用 BulkProcessor 实现批量添加数据

ElasticSearch 1、ElasticSearch学习随笔之基础介绍 2、ElasticSearch学习随笔之简单操作 3、ElasticSearch学习随笔之java api 操作 4、ElasticSearch学习随笔之SpringBoot Starter 操作 5、ElasticSearch学习随笔之嵌套操作 6、ElasticSearch学习随笔之分词算法 7、ElasticS…

使用numpy处理图片——缩放图片

缩放图片是让图片丢失部分像素&#xff0c;从而导致图片失真。一种比较简单的方法就是抽取法。比如如果我们要将照片在宽度上缩小50%&#xff0c;则可以在第二维度上每隔2个像素取一个像素来保存&#xff1b;类似的&#xff0c;如果我们希望在高度上缩小50%&#xff0c;则可以在…

AUTO SEG-LOSS SEARCHING METRIC SURROGATES FOR SEMANTIC SEGMENTATION

AUTO SEG-LOSS: 搜索度量替代语义分割 论文链接&#xff1a;https://arxiv.org/abs/2010.07930 项目链接&#xff1a;https://github.com/fundamentalvision/Auto-Seg-Loss ABSTRACT 设计合适的损失函数是训练深度网络的关键。特别是在语义分割领域&#xff0c;针对不同的场…

腾讯云服务器建站教程——2024更新部署网站教程

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网txyfwq.com分享使用腾讯云服务器建站教程&#xff0c;…

【复现】Spider-Flow RCE漏洞(CVE-2024-0195)_16

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Spider Flow 是一个高度灵活可配置的爬虫平台&#xff0c;用户无需编写代码&#xff0c;以流程图的方式&#xff0c;即可实现爬虫…

基于SSM的电脑测评系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电脑测评系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

Codeforces Round 911 (Div. 2) C. Anji‘s Binary Tree (DFS + 树)

题目 思路: dfs树的每一条到叶子的路径, 并计算路径中需要修改的个数, 在这些个数中取最小值 注意: 本题中的树是以每个结点的左右孩子是什么的形式给出的, 所以可以不用建树, 只需保存每个结点的左右孩子是什么即可。 代码&#xff1a; #include<bits/stdc.h> using…