极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2349|回复: 0

5自由度串联机械臂实现搬运物品功能

[复制链接]
发表于 2023-3-24 09:35:01 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-3-24 09:35 编辑

1. 功能描述
     本文提供的示例所实现的功能为:实现5自由度串联机械臂搬运物品的功能。


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

主控板Basra主控板(兼容Arduino Uno)
扩展板
Bigfish2.1扩展板
舵机270°伺服电机、标准舵机
电池7.4V锂电池

电路连接说明:
舵机接线:由上至下依次连接在Bigfish扩展板的D4、D7、D11、D3、D8、D12接口上。


3. 功能实现
上位机:Controller 1.0
下位机编程环境:Arduino 1.8.19
3.1初始位置的设定
① 将Controller下位机程序servo_bigfish.ino直接下载到主控板。这段代码供Controller上位机与主控板通信,并允许调试舵机。代码如下:
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-02-20 https://www.robotway.com/

  6.   ------------------------------

  7. /*

  8. * Bigfish扩展板舵机口; 4, 7, 11, 3, 8, 12, 14, 15, 16, 17, 18, 19

  9. * 使用软件调节舵机时请拖拽对应序号的控制块

  10. */

  11. #include <Servo.h>


  12. #define ANGLE_VALUE_MIN 0

  13. #define ANGLE_VALUE_MAX 180

  14. #define PWM_VALUE_MIN 500

  15. #define PWM_VALUE_MAX 2500


  16. #define SERVO_NUM 12


  17. Servo myServo[SERVO_NUM];


  18. int data_array[2] = {0,0};   //servo_pin: data_array[0], servo_value: data_array[1];

  19. int servo_port[SERVO_NUM] = {4, 7, 11, 3, 8, 12, 14, 15, 16, 17, 18, 19};

  20. int servo_value[SERVO_NUM] = {};


  21. String data = "";


  22. boolean dataComplete = false;


  23. void setup() {

  24.   Serial.begin(9600);



  25. }


  26. void loop() {



  27.   while(Serial.available())

  28.   {

  29.     int B_flag, P_flag, T_flag;

  30.     data = Serial.readStringUntil('\n');

  31.     data.trim();

  32.     for(int i=0;i<data.length();i++)

  33.     {

  34.       //Serial.println(data[i]);

  35.       switch(data[i])

  36.       {

  37.         case '#':

  38.           B_flag = i;  

  39.         break;

  40.         case 'P':

  41.         {

  42.           String pin = "";

  43.           P_flag = i;

  44.           for(int i=B_flag+1;i<P_flag;i++)

  45.           {

  46.             pin+=data[i];

  47.           }

  48.           data_array[0] = pin.toInt();

  49.         }

  50.         break;

  51.         case 'T':

  52.         {

  53.           String angle = "";

  54.           T_flag = i;

  55.           for(int i=P_flag+1;i<T_flag;i++)

  56.           {

  57.             angle += data[i];

  58.           }

  59.           data_array[1] = angle.toInt();

  60.           servo_value[pin2index(data_array[0])] = data_array[1];

  61.         }

  62.         break;

  63.         default: break;

  64.       }     

  65.     }

  66.    

  67.     /*

  68.     Serial.println(B_flag);

  69.     Serial.println(P_flag);

  70.     Serial.println(T_flag);

  71.    

  72.     for(int i=0;i<2;i++)

  73.     {

  74.       Serial.println(data_array[i]);

  75.     }

  76.     */

  77.    

  78.     dataComplete = true;

  79.   }



  80.   if(dataComplete)

  81.   {

  82.     for(int i=0;i<SERVO_NUM;i++)

  83.     {

  84.       ServoGo(i, servo_value[i]);

  85.       /*********************************串口查看输出***********************************/

  86. //      Serial.print(servo_value[i]);

  87. //      Serial.print(" ");

  88.     }

  89. //    Serial.println();

  90.       /*********************************++++++++++++***********************************/


  91.     dataComplete = false;

  92.   }




  93. }


  94. void ServoStart(int which){

  95.   if(!myServo[which].attached() && (servo_value[which] != 0))myServo[which].attach(servo_port[which]);

  96.       else return;

  97.   pinMode(servo_port[which], OUTPUT);

  98. }


  99. void ServoStop(int which){

  100.   myServo[which].detach();

  101.   digitalWrite(servo_port[which],LOW);

  102. }


  103. void ServoGo(int which , int where){

  104.   ServoStart(which);

  105.   if(where >= ANGLE_VALUE_MIN && where <= ANGLE_VALUE_MAX)

  106.   {

  107.     myServo[which].write(where);

  108.   }

  109.   else if(where >= PWM_VALUE_MIN && where <= PWM_VALUE_MAX)

  110.   {

  111.     myServo[which].writeMicroseconds(where);

  112.   }

  113. }


  114. int pin2index(int _pin){

  115.   int index;

  116.   switch(_pin)

  117.   {

  118.     case 4: index = 0; break;

  119.     case 7: index = 1; break;

  120.     case 11: index = 2; break;

  121.     case 3: index = 3; break;

  122.     case 8: index = 4; break;

  123.     case 12: index = 5; break;

  124.     case 14: index = 6; break;

  125.     case 15: index = 7; break;

  126.     case 16: index = 8; break;

  127.     case 17: index = 9; break;

  128.     case 18: index = 10; break;

  129.     case 19: index = 11; break;

  130.   }

  131.   return index;

  132. }
复制代码

下载完成后,保持主控板和电脑的USB连接,以便利用上位机进行调试。
② 双击打开Controller 1.0b.exe:

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

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

⑤ 将该数组直接复制到相应的Arduino程序中的get_coordinate()部分进行使用。
3.2调试好角度后,将机械臂搬运例程(5df_handling.ino)下载到主控板:
  1. /*------------------------------------------------------------------------------------

  2.   版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

  3.            Distributed under MIT license.See file LICENSE for detail or copy at

  4.            https://opensource.org/licenses/MIT

  5.            by 机器谱 2023-02-20 https://www.robotway.com/

  6.   ------------------------------*/

  7. /*

  8. 本程序要实现一个5自由度串联机械臂搬运物品的功能。

  9. 由机械臂从夹爪到底座的舵机依次连接在Bigfish扩展板的D4、D7、D11、D3、D8、D12接口上。

  10. */

  11. #define EYEINIT 174

  12. #define HEADINIT 90

  13. #define NECKINIT 124

  14. #define UPBODYINIT 72

  15. #define DOWNBODYINIT 100

  16. #define FOOTINIT 88

  17. #define EYE0 130

  18. #define HEAD0 90

  19. #define NECK0 170

  20. #define UPBODY0 160

  21. #define DOWNBODY0 79

  22. #define FOOT0 36

  23. #define EYE1 130

  24. #define HEAD1 90

  25. #define NECK1 170

  26. #define UPBODY1 160

  27. #define DOWNBODY1 80

  28. #define FOOT1 130

  29. #include<Wire.h>

  30. #include <Servo.h>                                          

  31. #define PIN_SERVO_EYE 4                                        //定义各个舵机所对应的端口;

  32. #define PIN_SERVO_HEAD 7

  33. #define PIN_SERVO_NECK   11

  34. #define PIN_SERVO_UPBODY   3

  35. #define PIN_SERVO_DOWNBODY 8

  36. #define PIN_SERVO_FOOT 12

  37. #define OPERATE_TIME 3000

  38. #define SERVO_EYE 0                                        //定义各个舵机所对应的端口;

  39. #define SERVO_HEAD 1

  40. #define SERVO_NECK   2

  41. #define SERVO_UPBODY   3

  42. #define SERVO_DOWNBODY 4

  43. #define SERVO_FOOT 5

  44. int servoPin[6] = {PIN_SERVO_EYE, PIN_SERVO_HEAD, PIN_SERVO_NECK, PIN_SERVO_UPBODY,PIN_SERVO_DOWNBODY,PIN_SERVO_FOOT};

  45. Servo myServo[6];

  46. void setup() {

  47.   // put your setup code here, to run once:

  48.   delay(1000);

  49.   Serial.begin(9600);

  50.   resetArm();

  51. }

  52. void loop() {

  53.   // put your main code here, to run repeatedly:

  54.     resetArm(); //机械臂复位

  55.     getCube();   //机械臂开始抓取货物

  56.     putCube();   //机械臂开始释放货物

  57.     delay(2000);//等待2秒

  58. }

  59. void resetArm(){   //舵机复位函数;

  60.     for(int i = 0; i < 6; i++)

  61.         myServo[i].attach(servoPin[i]);

  62.         myServo[SERVO_EYE].write(EYEINIT);

  63.         myServo[SERVO_HEAD].write(HEADINIT);

  64.         myServo[SERVO_NECK].write(NECKINIT);

  65.         myServo[SERVO_UPBODY].write(UPBODYINIT);

  66.         myServo[SERVO_DOWNBODY].write(DOWNBODYINIT);

  67.         myServo[SERVO_FOOT].write(FOOTINIT);

  68.         delay(1500);

  69. }

  70. void getCube(){   //抓取物料动作序列函数;

  71.     ServoMove(SERVO_FOOT, FOOTINIT, FOOT0, OPERATE_TIME);

  72.     ServoMove(SERVO_UPBODY, UPBODYINIT,UPBODY0, OPERATE_TIME);

  73.     ServoMove(SERVO_HEAD, HEADINIT, HEAD0, OPERATE_TIME);

  74.     ServoMove(SERVO_NECK, NECKINIT, NECK0, OPERATE_TIME);

  75.     ServoMove(SERVO_EYE, EYEINIT, EYE0, OPERATE_TIME);

  76.     ServoMove(SERVO_DOWNBODY, DOWNBODYINIT, DOWNBODY0, OPERATE_TIME);

  77.     ServoMove(SERVO_HEAD, HEAD0, HEADINIT, OPERATE_TIME);

  78.     ServoMove(SERVO_UPBODY, UPBODY0, UPBODYINIT, OPERATE_TIME);

  79.     ServoMove(SERVO_EYE,   EYE0, EYEINIT, OPERATE_TIME);

  80.     ServoMove(SERVO_NECK, NECK0, NECKINIT, OPERATE_TIME);

  81.     ServoMove(SERVO_DOWNBODY, DOWNBODY0, DOWNBODYINIT, OPERATE_TIME);

  82. }

  83. void putCube()     //机械臂开始释放货物

  84. {

  85.     ServoMove(SERVO_FOOT, FOOT0, FOOT1 , OPERATE_TIME);

  86.     ServoMove(SERVO_HEAD, HEADINIT, HEAD1, OPERATE_TIME);

  87.     ServoMove(SERVO_NECK, NECKINIT, NECK1, OPERATE_TIME);

  88.     ServoMove(SERVO_UPBODY, UPBODYINIT,UPBODY1, OPERATE_TIME);

  89.     ServoMove(SERVO_EYE, EYEINIT, EYE1, OPERATE_TIME);

  90.     ServoMove(SERVO_DOWNBODY, DOWNBODYINIT, DOWNBODY1, OPERATE_TIME);  

  91.     ServoMove(SERVO_HEAD, HEAD1, HEADINIT, OPERATE_TIME);

  92.     ServoMove(SERVO_UPBODY, UPBODY1, UPBODYINIT, OPERATE_TIME);

  93.     ServoMove(SERVO_EYE,   EYE1, EYEINIT, OPERATE_TIME);

  94.     ServoMove(SERVO_NECK, NECK1, NECKINIT, OPERATE_TIME);

  95.     ServoMove(SERVO_DOWNBODY, DOWNBODY1, DOWNBODYINIT, OPERATE_TIME);

  96.     ServoMove(SERVO_FOOT, FOOT1, FOOTINIT , OPERATE_TIME);         

  97. }

  98. void ServoMove(int which, int _start, int _finish, long t)   //舵机动作函数:它有四个参数,舵机号,初始角度,目标角度,动作时间;

  99. {

  100.     static int direct;

  101.     static int diff;

  102.     static long deltaTime;

  103.     if(_start <= _finish)

  104.       direct = 1;

  105.     else

  106.       direct = -1;

  107.     diff = abs(_finish - _start);

  108.     deltaTime = (long) (t / 180);

  109.    

  110.     for(int i = 0; i < diff; i++){

  111.         myServo[which].write(_start + i * direct);

  112.         Serial.println(_start + i * direct);

  113.         delay(deltaTime);

  114.     }

  115. }
复制代码

4. 资料下载
资料内容:
①Arduino搬运-例程源代码
②Controller1.0b资料包
资料下载地址:https://www.robotway.com/h-col-192.html

想了解更多机器人开源项目资料请关注 机器谱网站 https://www.robotway.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 04:06 , Processed in 0.057630 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表