6自由度串联机械臂实现电磁铁搬运功能

news/2024/12/12 6:44:14/

1. 功能描述

       R323样机是一款拥有6自由度的串联机械臂。本文提供的示例所实现的功能为:在6自由度串联机械臂样机上安装电磁铁,底座上安装近红外传感器,当检测到有物品时,实现机械臂电磁铁搬运物品的功能。

2. 电子硬件

    在这个示例中,我们采用了以下硬件,请大家参考:

主控板Basra(兼容Arduino Uno)
扩展板Bigfish2.1
舵机

270°伺服电机、标准舵机

传感器近红外传感器
电池7.4V锂电池
其它电磁铁、USB线

电路连接说明:

① 270°伺服电机分别连接在Bigfish扩展板D4、D7、D11、D3、D8、D12接口上

② 2个近红外传感器分别连接在A0及A4接口上

③ 电磁铁连接在Bigfish扩展板D9,D10接口上

3. 功能实现

上位机:Controller 1.0

下位机编程环境:Arduino 1.8.19

3.1初始位置的设定

① 将Controller下位机程序servo_bigfish.ino直接下载到主控板。这段代码供Controller上位机与主控板通信,并允许调试舵机。代码如下:

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-01-31 https://www.robotway.com/------------------------------/** Bigfish扩展板舵机口; 4, 7, 11, 3, 8, 12, 14, 15, 16, 17, 18, 19* 使用软件调节舵机时请拖拽对应序号的控制块*/#include <Servo.h>#define ANGLE_VALUE_MIN 0#define ANGLE_VALUE_MAX 180#define PWM_VALUE_MIN 500#define PWM_VALUE_MAX 2500#define SERVO_NUM 12Servo myServo[SERVO_NUM];int data_array[2] = {0,0};   //servo_pin: data_array[0], servo_value: data_array[1];int servo_port[SERVO_NUM] = {4, 7, 11, 3, 8, 12, 14, 15, 16, 17, 18, 19};int servo_value[SERVO_NUM] = {};String data = "";boolean dataComplete = false;void setup() {Serial.begin(9600);}void loop() {while(Serial.available()){int B_flag, P_flag, T_flag;data = Serial.readStringUntil('\n');data.trim();for(int i=0;i<data.length();i++){//Serial.println(data[i]);switch(data[i]){case '#':B_flag = i;  break;case 'P':{String pin = "";P_flag = i;for(int i=B_flag+1;i<P_flag;i++){pin+=data[i];}data_array[0] = pin.toInt();}break;case 'T':{String angle = "";T_flag = i;for(int i=P_flag+1;i<T_flag;i++){angle += data[i];}data_array[1] = angle.toInt();servo_value[pin2index(data_array[0])] = data_array[1];}break;default: break;}     }/*Serial.println(B_flag);Serial.println(P_flag);Serial.println(T_flag);for(int i=0;i<2;i++){Serial.println(data_array[i]);}*/dataComplete = true;}if(dataComplete){for(int i=0;i<SERVO_NUM;i++){ServoGo(i, servo_value[i]);/*********************************串口查看输出***********************************///      Serial.print(servo_value[i]);//      Serial.print(" ");}//    Serial.println();/*********************************++++++++++++***********************************/dataComplete = false;}}void ServoStart(int which){if(!myServo[which].attached() && (servo_value[which] != 0))myServo[which].attach(servo_port[which]);else return;pinMode(servo_port[which], OUTPUT);}void ServoStop(int which){myServo[which].detach();digitalWrite(servo_port[which],LOW);}void ServoGo(int which , int where){ServoStart(which);if(where >= ANGLE_VALUE_MIN && where <= ANGLE_VALUE_MAX){myServo[which].write(where);}else if(where >= PWM_VALUE_MIN && where <= PWM_VALUE_MAX){myServo[which].writeMicroseconds(where);}}int pin2index(int _pin){int index;switch(_pin){case 4: index = 0; break;case 7: index = 1; break;case 11: index = 2; break;case 3: index = 3; break;case 8: index = 4; break;case 12: index = 5; break;case 14: index = 6; break;case 15: index = 7; break;case 16: index = 8; break;case 17: index = 9; break;case 18: index = 10; break;case 19: index = 11; break;}return index;}

下载完成后,保持主控板和电脑的USB连接,以便利用上位机进行调试。

② 双击打开Controller 1.0b.exe:

 ③ 界面左上角选择:设置-面板设置,弹出需要显示的调试块,可通过勾选隐藏不需要调试的舵机块:联机-选择主控板对应端口号以及波特率。

 ④ 拖动进度条,可以观察相应的舵机角度转动。写好对应的舵机调试角度,勾选左下角添加-转化,获得舵机调试的数组:

 ⑤ 将该数组直接复制到相应的arduino软件的程序中进行使用。

3.2调试好角度后将电磁铁搬运例程(jixieshoubi.ino)下载到主控板:

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-02-07 https://www.robotway.com/------------------------------*///#define EYEINIT 174#define HEADINIT 90#define NECKINIT 124#define UPBODYINIT 72#define DOWNBODYINIT 100#define FOOTINIT 88#define EYE0 130#define HEAD0 90#define NECK0 170#define UPBODY0 160#define DOWNBODY0 79#define FOOT0 36#define EYE1 130#define HEAD1 90#define NECK1 170#define UPBODY1 160#define DOWNBODY1 80#define FOOT1 130#include<Wire.h>#include <Servo.h>                                           #define PIN_SERVO_EYE 4                                        //定义各个舵机所对应的端口;#define PIN_SERVO_HEAD 7#define PIN_SERVO_NECK   11#define PIN_SERVO_UPBODY   3#define PIN_SERVO_DOWNBODY 8#define PIN_SERVO_FOOT 12#define OPERATE_TIME 3000#define SERVO_EYE 0                                        //定义各个舵机所对应的端口;#define SERVO_HEAD 1#define SERVO_NECK   2#define SERVO_UPBODY   3#define SERVO_DOWNBODY 4#define SERVO_FOOT 5int servoPin[6] = {PIN_SERVO_EYE, PIN_SERVO_HEAD, PIN_SERVO_NECK, PIN_SERVO_UPBODY,PIN_SERVO_DOWNBODY,PIN_SERVO_FOOT};Servo myServo[6];void setup() {// put your setup code here, to run once:delay(1000);Serial.begin(9600);resetArm();}void loop() {// put your main code here, to run repeatedly:resetArm(); //机械臂复位getCube();   //机械臂开始抓取货物putCube();   //机械臂开始释放货物delay(2000);//等待2秒}void resetArm(){   //舵机复位函数;for(int i = 0; i < 6; i++)myServo[i].attach(servoPin[i]);myServo[SERVO_EYE].write(EYEINIT);myServo[SERVO_HEAD].write(HEADINIT);myServo[SERVO_NECK].write(NECKINIT);myServo[SERVO_UPBODY].write(UPBODYINIT);myServo[SERVO_DOWNBODY].write(DOWNBODYINIT);myServo[SERVO_FOOT].write(FOOTINIT);delay(1500);}void getCube(){   //抓取物料动作序列函数;ServoMove(SERVO_FOOT, FOOTINIT, FOOT0, OPERATE_TIME);ServoMove(SERVO_UPBODY, UPBODYINIT,UPBODY0, OPERATE_TIME);ServoMove(SERVO_HEAD, HEADINIT, HEAD0, OPERATE_TIME);ServoMove(SERVO_NECK, NECKINIT, NECK0, OPERATE_TIME);ServoMove(SERVO_EYE, EYEINIT, EYE0, OPERATE_TIME);ServoMove(SERVO_DOWNBODY, DOWNBODYINIT, DOWNBODY0, OPERATE_TIME);ServoMove(SERVO_HEAD, HEAD0, HEADINIT, OPERATE_TIME);ServoMove(SERVO_UPBODY, UPBODY0, UPBODYINIT, OPERATE_TIME);ServoMove(SERVO_EYE,   EYE0, EYEINIT, OPERATE_TIME);ServoMove(SERVO_NECK, NECK0, NECKINIT, OPERATE_TIME);ServoMove(SERVO_DOWNBODY, DOWNBODY0, DOWNBODYINIT, OPERATE_TIME);}void putCube()     //机械臂开始释放货物{ServoMove(SERVO_FOOT, FOOT0, FOOT1 , OPERATE_TIME);ServoMove(SERVO_HEAD, HEADINIT, HEAD1, OPERATE_TIME);ServoMove(SERVO_NECK, NECKINIT, NECK1, OPERATE_TIME);ServoMove(SERVO_UPBODY, UPBODYINIT,UPBODY1, OPERATE_TIME);ServoMove(SERVO_EYE, EYEINIT, EYE1, OPERATE_TIME);ServoMove(SERVO_DOWNBODY, DOWNBODYINIT, DOWNBODY1, OPERATE_TIME);  ServoMove(SERVO_HEAD, HEAD1, HEADINIT, OPERATE_TIME);ServoMove(SERVO_UPBODY, UPBODY1, UPBODYINIT, OPERATE_TIME);ServoMove(SERVO_EYE,   EYE1, EYEINIT, OPERATE_TIME);ServoMove(SERVO_NECK, NECK1, NECKINIT, OPERATE_TIME);ServoMove(SERVO_DOWNBODY, DOWNBODY1, DOWNBODYINIT, OPERATE_TIME);ServoMove(SERVO_FOOT, FOOT1, FOOTINIT , OPERATE_TIME);         }void ServoMove(int which, int _start, int _finish, long t)   //舵机动作函数:它有四个参数,舵机号,初始角度,目标角度,动作时间;{static int direct;static int diff;static long deltaTime;if(_start <= _finish)direct = 1;elsedirect = -1;diff = abs(_finish - _start);deltaTime = (long) (t / 180);for(int i = 0; i < diff; i++){myServo[which].write(_start + i * direct);Serial.println(_start + i * direct);delay(deltaTime);}}

 4. 资料内容

​①电磁铁搬运-程序源代码
​②电磁铁搬运-样机3D文件
​③Controller1.0b资料包
资料内容详见 6自由度串联机械臂-电磁铁搬运


http://www.ppmy.cn/news/36554.html

相关文章

vue项目使用Print.js插件实现PDF文件打印

一&#xff0c;Print.js介绍 Print.js主要是为了帮助我们在应用程序中直接打印PDF文件&#xff0c;而不需要离开界面&#xff0c;也不需要使用嵌入。对于用户不需要打开或下载PDF文件的特殊情况&#xff0c;只需要打印即可。 例如&#xff0c;当用户请求打印在服务器端生成的报…

如何把ntfs改成苹果电脑使用及mac写入ntfs硬盘软件教程

ntfs是一种功能强大的文件系统&#xff0c;该格式的文件系统具有存储空间大&#xff0c;传输单个文件能力强&#xff0c;安全系数高等诸多优点&#xff0c;被广泛应用在移动硬盘中。但ntfs格式硬盘&#xff0c;不能在mac中被正常读写&#xff0c;那么ntfs怎么在mac使用&#xf…

leetcode 汉诺塔问题(面试题)

题目 在经典汉诺塔问题中&#xff0c;有 3 根柱子及 N 个不同大小的穿孔圆盘&#xff0c;盘子可以滑入任意一根柱子。一开始&#xff0c;所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子;…

Matplotlib库基础图表函数及引力波的绘制实例

pyplot基本图表函数概述 pyplot饼图的绘制 plt.pie() lables指的是饼图的标签 sizes指的是对应的尺寸 explode让第二个30%突出0.1 autopct中间显示百分数的方式 shadowFalse二维饼图不带阴影 startangle90饼图的起始角度 加plt.axis(equal)可以让饼图成为一个正圆形的饼图…

Tomcat学习之源码模块

Tomcat核心模块剖析 Tomcat是一款流行的开源Servlet容器&#xff0c;它提供了一个Web应用程序的运行环境。Tomcat的核心模块可以分为以下几个方面&#xff1a; Catalina&#xff1a; Catalina是Tomcat的核心组件之一&#xff0c;它负责管理Tomcat的生命周期和处理请求。Cata…

【Python】照片居然能变素描?不会画画但是咱会代码

文章目录前言一、准备二、下载预训练模型总结前言 Photo-Sketching 一个能将照片的轮廓识别出来并将其转化为“速写”型图像的开源模块。 比如&#xff0c;这只小狗&#xff1a; 经过模型的转化&#xff0c;会变成卡通版的小狗&#xff1a; 非常秀&#xff0c;这很人工智能…

基于Python的高光谱图像分析教程

1、前言超光谱图像 (HSI) 分析因其在从农业到监控的各个领域的应用而成为人工智能 (AI) 研究的前沿领域之一。 该领域正在发表许多研究论文&#xff0c;这使它变得更加有趣&#xff01; 和“对于初学者来说&#xff0c;在 HSI 上开始模式识别和机器学习是相当麻烦的”&#xff…

pywinauto使用经验

在开发Windows应用程序时&#xff0c;我们经常需要进行测试来确保程序的质量和稳定性。手动测试是一种常见的方法&#xff0c;但是它非常耗时和繁琐&#xff0c;特别是对于大型的应用程序&#xff0c;测试工作量非常大。因此&#xff0c;我们需要自动化测试工具来帮助我们提高测…