SKU:RB-13K111 AS-6DOF多功能铝合金机械臂-银色

来自ALSROBOT WiKi
2018年7月18日 (三) 17:26Arduino77讨论 | 贡献的版本

跳转至: 导航搜索
13K11101.png

目录

产品概述

机械手臂目前在机械人技术领域中得到广泛的应用,在工业制造、医学治疗、娱乐服务、教学应用、军事以及太空探索等领域都能见到它的身影。虽然大家经常在电影或者电视中见过,似曾想过拥有一台属于自己的机械臂,因其功能针对性强和高额的售价,使我们望而却步。现在你不必担心这个问题了,AS-6D0F铝合金机械臂套件,可以实现你的机器人梦想。此版说明书主要介绍如何利用4个大按钮模块与Arduino Uno控制器之间的通讯直接控制六自由度机械臂并且在LCD2004液晶屏上实时显示监控到的信息,此说明书还介绍Arduino Uno控制器与LCD2004液晶屏及大按键之间的接线和调试过程,按照此说明书的步骤一步一步的组装完成后,给其上电,通过4个大按钮模块就可以轻松实现对六自由度机械臂的控制。

产品参数

  1. 产品名称:AS-6DOF多功能铝合金机械臂
  2. 产品类型:机械手臂
  3. 产品货号:RB - 13K111
  4. 产品颜色:银色
  5. 夹持器材质:金属
  6. 主控制器:Starduino UNO R3 控制器
  7. 编程软件:Arduino IDE、Ardublock、S4A
  8. 基础模块:机械臂、双路开关电源、Starduino UNO R3 控制器、传感器扩展板 V5.0、大按钮模块、IIC LCD2004 液晶扩展板
  9. 控制方式:自主编程
  10. 夹持重量:0.5kg
  11. 套件供电:双路开关电源:12V/1.5A - 5V/8A
  12. 重量:2.0KG

主控器技术参数

  1. 主控器:Carduino UNO R3
  2. 微处理器:ATmega328
  3. Flash 内存:32 KB (ATmega328 其中0.5 KB 用于引导程序)
  4. 工作电压:5V
  5. 输入电压:接上USB 时无须外部供电或外部7V~12V DC 输入
  6. 输出电压:5V DC 输出和3.3V DC 输出和外部电源输入
  7. 时钟频率:16 MHz
  8. 输入电压:7-12V(推荐)
  9. 输入电压:6-20V(限制)
  10. 支持USB 接口协议及供电(不需外接电源)
  11. 支持ISP 下载功能
  12. 数字I/O 端口:14(6 个PWM 输出口)
  13. 模拟输入端口:6
  14. 直流电流:40mA(I/O 端口)
  15. 直流电流:50mA(3.3V 端口)
  16. EEPROM:1 KB (ATmega328)
  17. SRAM:2 KB (ATmega328)
  18. 尺寸:75x55x15mm

产品清单

RB - 13K012 AS - 6DOF 多功能铝合金机械臂 - 银色 - 不含电控
序号 产品名称 产品货号 数量
1 机械臂底盘 RB - 09M031 1
2 金属齿RB-150MG舵机(含附件包) RB - 04M006 6
3 新机械臂金属圆盘(140mm) RB - 09M139 1
4 机械臂转盘 RB - 09M093 1
5 新机械臂金属圆盘(120mm) RB - 09M138 1
6 AS - 6DOF机械手专用夹持器 RB - 09M073 3
7 铝合金多功能舵机支架 RB - 09M002 4
8 铝合金长 U 型支架 RB - 09M005 3
9 铝合金L型支架 RB - 09M017 1
10 进口杯士轴承组件 RB - 09M083 3
11 金属舵盘 RB - 04M024 1
12 优质纯铜固定柱 M3*10+6 RB - 12C072 14
13 优质纯铜固定柱M3*30+6 RB - 12C076 3
14 M3盖姆 RB - 12C114 14
15 六角螺母 M3 RB - 12C089 6
16 十字槽固定螺丝 M2.5*6 RB - 12C087 16
17 六角螺母 M2.5 RB - 12C090 16
18 十字槽固定螺丝 M4*8 RB - 12C086 24
19 六角螺母 M4 RB - 12C091 24
20 十字槽固定螺丝 M3*6 RB - 12C081 7
21 十字槽固定螺丝 M3*10 RB - 12C083 7
22 M3弹垫 RB - 12C098 17
23 机械手夹持器固定螺丝白色自攻钉 RB - 12C099 2
24 机械手夹持器固定螺丝黑色自攻钉 RB - 09M046 2
25 黑色扎带 RB - 12C101 5
26 优质舵机延长线(30CM) RB - 06L009 3
27 优质塑料捆绳(40CM) RB - 12C102 1
28 Starduino UNO R3 控制器 RB - 01C076A 1
29 传感器扩展板 V5.0 RB - 01C015B 1
30 IIC LCD2004 液晶屏 RB - 05L012 1
31 按压式大按钮模块 RB - 02S049A 4
32 3P 传感器连接线 RB - 06L003 4
33 DC 接头 RB - 10P016 1
34 数据下载线 RB - 06L020 1
35 机械臂专用开关电源 RB - 10P007 1
36 3D 打印操作盒 套件中不包含,可以单独定制 1

安装连线

步骤1:如图所示,CarDuino Uno 控制器与传感器扩展板连接,并通过 USB 连接线给 Carduino UNO 上传例子程序。

13K11118.png

13K11112.png

步骤2:如图所示,将按压式大按钮模块与传感器扩展板 V5.0 的模拟接口连接。
将 4 个大按钮模块分别接到传感器扩展板 v5.0 的 4 个模拟口A0、A1、A2、A3,作为机械臂的控制按键,功能如下:

  • A0被按下时,舵机号从上至下选中
  • A1被按下时,舵机号从下至上选中
  • A2被按下时,舵机顺时针转
  • A3被按下时,舵机逆时针转
13K11114.png

步骤3:如下图所示,将 RB-150MG 与传感器扩展板 V5.0 连接,依次连接底盘到夹持器舵机。

  • 将底盘到夹持器的舵机顺次连接到传感器扩展板的 6 个数字口 D4(底盘舵机)D5、D6、D7、D8、D9(夹持器舵机)。
13K11113.png

步骤4 如图所示:将 IIC LCD2004 液晶显示屏与传感器扩展板连接,IIC LCD2004液晶显示屏接到传感器扩展板 v5.0 的 IIC 接口,连接时需要注意红色对应“+”,黑色对应“-”

13K11115.png

步骤5 图下图所示:给机械臂电控部分进行供电。

  • 取下传感器扩展板 v5.0 的跳线帽,使用开关电源(5V 给传感器扩展板 v5.0 供电,12V 给 CarDuino Uno 控制器供电),红色接 VCC,黑色接 GND(注意区分正负极)。
13K11116.png

13K11117.png

步骤6 完成以上步骤后,机械臂所有电控及供电就全部安装完成,接下来回头检查一下各个部分的接线,尤其是是否有电源和地接反的情况,如果确定接线无误,就可以给机械臂供电了。

例子程序

#include <Servo.h>      //调用一些库文件
#include <TimedAction.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//定义舵机位置名称,并编号。
const int base =      0;     //底座舵机    
const int shoulder =   1;          
const int elbow =     2;        
const int wristflex =   3;        
const int wristrot =    4;          
const int gripper =    5;         //夹持器舵机 

const int stdDelay =   20;         //舵机运动延时(单位ms)
const int maxServos =  6;         //舵机的数量
const int centerPos =  90;        //舵机中位位置

int keyDelay = 100;              //每个按键之间的最大延时时间ms
int buttonDelay = 50;           //每个按键之间的最小延时时间ms
int thisServo = base;           //定义起始电机
unsigned long key_millis = 0;      
unsigned long button_millis = 0;

typedef struct{              //数组框架结构
  byte neutral;             //中位角度,起始位置
  byte minPos;             //最小角度
  byte maxPos;            //最大角度
  byte delaySpeed;         //延时时间
  byte curPos;            //舵机当前角度
} ServoPos;              //结构体名称

ServoPos servosPos[] = {    //对舵机限位
  { 90, 180, 10, stdDelay, 0 }, //中位90,最小角度180,最大角度10,范围0~180度。
  { 90, 180, 10, stdDelay, 0 },
  { 90, 180, 60, stdDelay, 0 },
  { 90, 170, 50, stdDelay, 0 },
  { 90, 180, 10, 10, 0 },
  { 90, 125, 55, 5, 0 }
};

byte serv = 90;
int counter = 0;
int curServo = 0;
int sMove[] = {0, 90, 0};
int sAttach[] = {0, 0};

LiquidCrystal_I2C lcd(0x27,20,4);     //0x27  D7~D0端口开关设置0x表示十六进制27转换成16进制数是00100111  1代表开,0代表关, 20列,4行,行号从零算起,第一行行号0,第二行行号1.
Servo servos[maxServos];
int destServoPos[maxServos];
int currentServoPos[maxServos];
 
void doServoFunc() {
  int x = curServo; 
  TimedAction servoMove[maxServos] = TimedAction(100, doServoFunc);
  if(destServoPos[x] == currentServoPos[x])
    servoMove[x].disable();       
  if(destServoPos[x] > currentServoPos[x])
    currentServoPos[x]++;
  else
    currentServoPos[x]--;
  
  servosPos[x].curPos = constrain(currentServoPos[x], servosPos[x].maxPos, servosPos[x].minPos);
  currentServoPos[x] = servosPos[x].curPos;
  servos[x].write(currentServoPos[x]);
  jointPos(x, currentServoPos[x]);
}

TimedAction servoMove[maxServos] = TimedAction(100, doServoFunc);   // 延时,延时时间为声明时间。
TimedAction keys = TimedAction(10, keypadFunc);

void setup() {                            //设置
  delay(200);
  Wire.begin();
  lcd.init();                             //LCD初始化             
  lcd.backlight();                 //LCD背光灯打开
  delay(500);
  lcd.on();                     // LCD开机
  setupDisplay();               //调用子程序,设置显示内容门,后面有定义。

  for(int i=0; i<maxServos; i++) {          
    servos[i].write(servosPos[i].neutral);//舵机归中位
    servosPos[i].curPos = servosPos[i].neutral;//设置舵机当前角度为初始角度
    servos[i].attach(i+4);//初始化舵机控制引脚,即第一个舵机为D4引脚控制
    destServoPos[i] = centerPos;//指定的舵机为90度
    currentServoPos[i] = centerPos;//当前的舵机为90度
    servoMove[i].disable();//舵机停止移动
  }      
}

void loop() {
  for(int x=0; x<maxServos; x++) {
    curServo = x;
    servoMove[x].check();
  }
  //timer.run();            
  keys.check();
  navSwitchFunc();
}

void servoTestFunc() {
  if(counter % 2) {
    Move(thisServo, servosPos[thisServo].minPos, servosPos[thisServo].delaySpeed);
  }
  else
    Move(thisServo, servosPos[thisServo].maxPos, servosPos[thisServo].delaySpeed);
  counter++;
}

void writeServo() {
  int servoNum = sMove[0];
  if(servoNum >=0 && servoNum <= maxServos) {
    destServoPos[servoNum] = sMove[1];
    servoMove[servoNum].enable();
    servoMove[servoNum].setInterval(sMove[2]);
  }
}

void setServoAttach() {
  int servo = 1;    // sAttach[0]
  int mode = 2;     // sAttach[1]
  if(servo >= 0 && servo <= maxServos) {
    if (mode == 1)
      servos[servo].attach(servo+4);
    else
      servos[servo].detach();
  }
}

void Move(int servoNum, int servoPosition, int delayTime) {  //舵机驱动指令
  sMove[0] = servoNum;             //所驱动舵机号
  sMove[1] = servoPosition;          //舵机的目标位置
  sMove[2] = delayTime;            //每个舵机运动的延迟时长
  writeServo();
}

void Attach(int servoNum, int servoMode) {
  sAttach[0] = servoNum;
  sAttach[1] = servoMode;
}

void navSwitchFunc() {                //键盘检测子程序
    if (millis() > button_millis + buttonDelay) {
    button_millis = millis();
    if(digitalRead(A0) == LOW) {      // 当A0引脚低电平
      thisServo--;                   //电机号自加1
      thisServo = constrain(thisServo, 0, 5); //电机控制范围
      jointPos(thisServo, servosPos[thisServo].curPos);
      delay(200);                 //延时200毫秒
    }
    if(digitalRead(A1)== LOW) {      //当A1引脚低电平
      thisServo++;                 //电机号自加1
      thisServo = constrain(thisServo, 0, 5); //电机控制范围
      jointPos(thisServo, servosPos[thisServo].curPos);
      delay(200);                 //延时200毫秒
    }
    if(digitalRead(A2) == LOW) {      //当A2引脚低电平
      byte t = thisServo;
      servosPos[t].curPos--;       //电机角度自减1
      servosPos[t].curPos = constrain(servosPos[t].curPos, servosPos[t].maxPos, servosPos[t].minPos);
      jointPos(t, servosPos[t].curPos);
    }
    if(digitalRead(A3) == LOW) {     //当A3引脚低电平
      byte t = thisServo;
      servosPos[t].curPos++;         //电机角度自减1
      servosPos[t].curPos = constrain(servosPos[t].curPos, servosPos[t].maxPos, servosPos[t].minPos);
      jointPos(t, servosPos[t].curPos);
    }
  }
}

void keypadFunc() {
  byte keypad = lcd.keypad();
  lcd.command(0);                
  if (keypad !=0) {
    if (millis() > key_millis + keyDelay) {
      keypress(keypad);
      key_millis = millis();
    }
  }
}

void keypress (byte keypad) {  //读取按键按下情况。       
  byte t;
  lcd.setCursor(15, 1);
  switch(keypad) {
    case 1: 
      lcd.print("1");
      t = base;
      servosPos[t].curPos--;
      break;
    case 2:
      lcd.print("2");
      t = shoulder;
      servosPos[t].curPos--;
      break;
    case 3:
      lcd.print("3");
      t = elbow;
      servosPos[t].curPos--;
      break;
    case 5:
      lcd.print("4");
      t = base;
      servosPos[t].curPos++;
      break;
    case 6:
      lcd.print("5");
      t = shoulder;
      servosPos[t].curPos++;
      break;
    case 7:
      lcd.print("6");
      t = elbow;
      servosPos[t].curPos++;
      break;
    case 9:
      lcd.print("7");
      t = wristflex;
      servosPos[t].curPos--;
      break;
    case 10:
      lcd.print("8");
      t = wristrot;
      servosPos[t].curPos--;
      break;
    case 11:
      lcd.print("9");
      t = gripper;
      servosPos[t].curPos--;
      break;
    case 13:
      lcd.print("*");
      t = wristflex;
      servosPos[t].curPos++;
      break;
    case 14:
      lcd.print("0");
      t = wristrot;
      servosPos[t].curPos++;
      break;
    case 15:
      lcd.print("#");
      t = gripper;
      servosPos[t].curPos++;
      break;   
  }
  servosPos[t].curPos = constrain(servosPos[t].curPos, servosPos[t].maxPos, servosPos[t].minPos);
  jointPos(t, servosPos[t].curPos);
}

void jointPos(byte t, byte pos) {    //定义两个byte类型的变量,t,pose.
  lcd.setCursor(6, 1);//电机所在位置名称
  switch(t) {
    case base:               // 1, 4
      lcd.print("bse");    //LCD显示bse
      break;
    case shoulder:           // 2, 5     
      lcd.print("shl");   //LCD显示shl
      break;
    case elbow:              // 3, 6
      lcd.print("elb");    //LCD显示elb
      break;
    case wristflex:          // 7, * 
      lcd.print("wfx");   //LCD显示wfx
      break;
    case wristrot:           // 8, 0    
      lcd.print("wrt");   //LCD显示wrt
      break;
    case gripper:            // 9, #
      lcd.print("grp");    //LCD显示grp
      break;
  }
  
  lcd.setCursor(2, 3);// 设置显示位置第4行,3列就是说前面空2格。
  lcd.print(" you are welcome  ");
  lcd.setCursor(6, 2);//pose后面显示的角度位置。
  lcd.print(pos, DEC); //当按键按下后显示角度值。
  servos[t].write(pos);
}

void setupDisplay() {    //子程序定义,LCD显示内容,开机立即显示。
  lcd.clear();          //LCD清屏
  lcd.blink_off();       //LCD光标闪烁关
  lcd.home();         //
  lcd.setCursor(1, 1);  //设置显示位置第2行,2列就是说前面空1格。
  lcd.print("key: ");   //显示内容 “key”
  lcd.setCursor(4, 0);   //设置显示位置第一行,5列就是说前面空4格。
  lcd.print("alsrobotbase      ");//显示内容”alsrobotbase”
  lcd.setCursor(1, 2);         // 设置显示位置
  lcd.print("Pos: ");           //显示内容”Pos”
}

电控部分说明书

6自由度机械臂机械部分安装说明
按压式大按钮模块使用说明书
IIC 2004液晶扩展板使用说明书
V5.0传感器扩展板使用说明
Arduino UNO入门教程
Arduino UNO 驱动安装
Arduino UNO 编程参考手册

产品相关推荐

Erweima.png

例程下载

库文件及例子程序下载链接:http://pan.baidu.com/s/1hsLxLrQ 密码:f4mz

产品购买地址

AS-6DOF 铝合金机械臂 Arduino版本

周边产品推荐

防水舵机

相关问题解答

arduino六自由机械臂编译不成功问题
Arduino UNO R3 可以实现机械臂控制吗?
6自由度机械臂舵机容易被拉下来

相关学习资料

AS-6DOF铝合金机械臂功能演示之定位抓取
6自由度机械臂玩儿家测评一
6自由度机械臂玩儿家测评二
奥松机器人技术论坛