极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1795|回复: 0

小型云台机械手红外搬运功能的实现

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

1. 功能说明
    在小型云台机械手前方安装近红外传感器,如果近红外触发(检测到有货物),机械手开始抓取货物,并将货物从一个区域搬运到另一个指定区域;否则,机械臂不动作。

2. 使用样机
     本实验使用的样机是用探索者兼容零件制作的。



3. 功能实现
   3.1 电子硬件
    在这个示例中,我们采用了以下硬件,请大家参考:
主控板
Basra(兼容Arduino Uno)
扩展板Bigfish2.1
传感器
近红外
电池7.4V锂电池

将夹爪、腕关节、底座关节的舵机分别接在扩展板的D4、D7以及D11舵机接口上,近红外传感器接在A0口上。




3.2编写程序
编写并烧录以下程序(Robotic_arm_three.ino),该程序将实现演示视频中的动作。
编程环境:Arduino 1.8.19

  1. /*******************************************************************************************


  2. 版权说明:Copyright 2022 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 机器谱 2022-12-21 https://www.robotway.com/

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

  7. 实验需求:

  8.          实现机器人搬运货物。


  9. 实现思路:

  10.          程序的整体思路为:在机械臂前方安装近红外传感器,如果近红外触发(检测到有货物),机械臂

  11.          开始抓取货物,并将货物从一个区域搬运到另一个指定区域;否则,机械臂不动作。


  12. 实验接线:

  13.          最上端的机械爪舵机接D4;

  14.          中间的机械身躯舵机接D7;

  15.          最下端的机械底座舵机接D11;

  16.          近红外传感器接A0。

  17. ********************************************************************************************/

  18. #include<ServoTimer2.h>

  19. #define NearInfraredSensor A0   //定义的近红外感器引脚的引脚

  20. #define Upward_servo_close 66   //机械爪闭合的角度值

  21. #define Upward_servo_open 115   //机械爪张开的角度值


  22. #define Middle_servo_init 85    //机械臂的初始角

  23. #define Middle_servo_left 10    //机械臂向左偏的角度

  24. #define Middle_servo_left1 50   //机械臂向左偏的角度


  25. #define Down_servo_middle 75   //机械底座初始角度值

  26. #define Down_servo_left 5      //机械底座向左偏的角度值


  27. ServoTimer2 myservo[3];       //声明舵机数组;


  28. int myservo_pin[3] = { 4, 7, 11 }; //定义三个舵机引脚号;

  29. int myservo_angle_init[3] = { Upward_servo_open, Middle_servo_left, Down_servo_middle };

  30. //定义三个舵机的初始角度值;

  31. int servo_num = sizeof(myservo_pin) / sizeof(myservo_pin[0]); //得出舵机总数



  32. void setup() {

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

  34.   Serial.begin(9600);

  35.   pinMode(NearInfraredSensor,INPUT); //传感器设置为输入模式;

  36.   ResetServo();       //初始化舵机角度

  37.   delay(2000);

  38. }


  39. void loop() {

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

  41.   int   Data_of_Sensor = !digitalRead( NearInfraredSensor );

  42.   int   Data = 0;

  43.   if( Data_of_Sensor == 1 ) {   //第1次判断近红外是否触发(是否有货物)

  44.     delay(300);

  45.     if( !digitalRead( NearInfraredSensor ) ) //第2次判断近红外是否触发(是否有货物)

  46.       {

  47.            Grab_And_Release();        //如果检测到有货物,机械臂开始抓取货物;

  48.       }

  49.   }

  50.   else {

  51.     delay(2);    //否则,程序等待;

  52.   }

  53. }




  54. void Grab_And_Release() //如果检测到有货物,机械臂开始抓取货物;

  55. {

  56.   ServoMove(1,Middle_servo_left,Middle_servo_init,1500);     //机械臂向下降(准备抓取货物)  

  57.   ServoMove(0,Upward_servo_open,Upward_servo_close,1500);    //机械爪闭合(抓取货物)

  58.   ServoMove(1,Middle_servo_init,Middle_servo_left1,1500);    //机械臂向上抬

  59.   ServoMove(2,Down_servo_middle,Down_servo_left,1500);       //机械底座转到物料放置区

  60.   ServoMove(1,Middle_servo_left1,Middle_servo_init,1500);    //机械臂向下降(准备释放货物)

  61.   ServoMove(0,Upward_servo_close,Upward_servo_open,1500);    //机械爪张开(释放货物)

  62.   ServoMove(1,Middle_servo_init,Middle_servo_left,1500);     //机械臂回复到初始角度

  63.   ServoMove(2,Down_servo_left,Down_servo_middle,1500);       //机械底座回复到初始角度

  64. }



  65. void ResetServo()     //初始化舵机角度

  66. {

  67.   for(int i=0;i<servo_num;i++)

  68.   {

  69.     myservo[i].attach(myservo_pin[i]);

  70.     myservo[i].write( MapAngle(myservo_angle_init[i]) );

  71.   }

  72. }


  73. int MapAngle(int which)   //映射函数(将0到180映射到500到2500)

  74. {

  75.   return ( map(which,0,180,500,2500) );

  76. }


  77. void ServoGo(int which,int where)   //开始驱动舵机(使舵机转动);

  78. {

  79.    myservo[which].write(MapAngle(where));

  80. }


  81. void ServoMove(int which,int start,int finish,int t) //舵机转动(舵机从start角度值转到finish角度值需要的时间为t ms)

  82. {

  83.    int a=0;

  84.    if( ( start - finish ) > 0 ) a = -1;

  85.    else a = 1;

  86.    for(int i=0;i<abs(start-finish);i++)

  87.   {

  88.     ServoGo(which,start+a*i);

  89.     delay(t/(abs(start-finish)));

  90.   }

  91. }
复制代码

4. 资料下载
​资料内容:
​①
R230-红外搬运-程序源代码
​②R230-红外搬运-样机3D文件

​资料下载地址:https://www.robotway.com/h-col-187.html


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








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 00:09 , Processed in 0.045547 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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