“(RB-13K111)6自由度機械臂(Arduino版本)”的版本間的差異

來自ALSROBOT WiKi
跳轉(zhuǎn)至: 導(dǎo)航、 搜索
(以“ ==產(chǎn)品概述== 機械手臂目前在機械人技術(shù)領(lǐng)域中得到廣泛的應(yīng)用,在工業(yè)制造、醫(yī)學治療、娛...”為內(nèi)容創(chuàng)建頁面)
 
第1行: 第1行:
 
[[文件:13K11101.png|500px|有框|右]]
 
[[文件:13K11101.png|500px|有框|右]]
 
==產(chǎn)品概述==
 
==產(chǎn)品概述==
?
機械手臂目前在機械人技術(shù)領(lǐng)域中得到廣泛的應(yīng)用,在工業(yè)制造、醫(yī)學治療、娛樂服務(wù)、教學應(yīng)用、軍事以及太空探索等領(lǐng)域都能見到它的身影。雖然大家經(jīng)常在電影或者電視中見過,似曾想過擁有一臺屬于自己的機械臂,因其功能針對性強和高額的售價,使我們望而卻步。現(xiàn)在你不必擔心這個問題了,AS-6D0F鋁合金機械臂套件,可以實現(xiàn)你的機器人夢想。此版說明書主要介紹如何利用4個大按鈕模塊與Arduino Uno控制器之間的通訊直接控制六自由度機械臂并且在LCD2004液晶屏上實時顯示監(jiān)控到的信息,此說明書還介紹了Arduino Uno控制器與LCD2004液晶屏及大按鍵之間的接線和調(diào)試過程,按照此說明書的步驟一步一步的組裝完成后,給其上電,通過4個大按鈕模塊就可以輕松實現(xiàn)對六自由度機械臂的控制。
+
機械手臂目前在機械人技術(shù)領(lǐng)域中得到廣泛的應(yīng)用,在工業(yè)制造、醫(yī)學治療、娛樂服務(wù)、教學應(yīng)用、軍事以及太空探索等領(lǐng)域都能見到它的身影。雖然大家經(jīng)常在電影或者電視中見過,似曾想過擁有一臺屬于自己的機械臂,因其功能針對性強和高額的售價,使我們望而卻步?,F(xiàn)在你不必擔心這個問題了,AS-6D0F鋁合金機械臂套件,可以實現(xiàn)你的機器人夢想。此版說明書主要介紹如何利用4個大按鈕模塊與Arduino Uno控制器之間的通訊直接控制六自由度機械臂并且在LCD2004液晶屏上實時顯示監(jiān)控到的信息,此說明書還介紹Arduino Uno控制器與LCD2004液晶屏及大按鍵之間的接線和調(diào)試過程,按照此說明書的步驟一步一步的組裝完成后,給其上電,通過4個大按鈕模塊就可以輕松實現(xiàn)對六自由度機械臂的控制。
 
==主控器技術(shù)參數(shù)==
 
==主控器技術(shù)參數(shù)==
 
# 主控器:Carduino UNO R3
 
# 主控器:Carduino UNO R3
第22行: 第22行:
 
# 尺寸:75x55x15mm
 
# 尺寸:75x55x15mm
 
==零件列表==
 
==零件列表==
?
[[文件:13K11102.png|700px|有框|]]
+
[[文件:13K11102.png|700px|有框|居中]]
 
==安裝連線==
 
==安裝連線==
?
步驟1:CarDuino Uno控制器與傳感器擴展版安裝并給Carduino UNO下載例程
+
步驟1:CarDuino Uno控制器與傳感器擴展版安裝并給Carduino UNO下載例程<br/>
?
步驟2:按壓式大按鈕模塊與傳感器連接
+
步驟2:按壓式大按鈕模塊與傳感器連接<br/>
?
將4個大按鈕模塊分別接到傳感器擴展板v5.0的4個模擬口A0.A1.A2.A3,作為機械臂的控制按鍵(A0被按下時舵機號從上至下1,A1被按下時舵機號從下至上1,A2被按下時舵機順時針轉(zhuǎn),A3被按下時舵機逆時針轉(zhuǎn))。
+
將4個大按鈕模塊分別接到傳感器擴展板v5.0的4個模擬口A0.A1.A2.A3,作為機械臂的控制按鍵(A0被按下時舵機號從上至下1,A1被按下時舵機號從下至上1,A2被按下時舵機順時針轉(zhuǎn),A3被按下時舵機逆時針轉(zhuǎn))。<br/>
?
步驟3:RB-150MG與傳感器擴展板連接
+
步驟3:RB-150MG與傳感器擴展板連接<br/>
?
將底盤到夾持器的舵機順次連接到傳感器擴展板的6個數(shù)字口D4(底盤舵機)D5.D6.D7.D8.D9(夾持器舵機)。
+
將底盤到夾持器的舵機順次連接到傳感器擴展板的6個數(shù)字口D4(底盤舵機)D5.D6.D7.D8.D9(夾持器舵機)。<br/>
?
[[文件:13K11103.png|700px|有框||傳感器連接完成效果圖]]
+
[[文件:13K11103.png|600px|有框|居中|傳感器連接完成效果圖]]<br/>
?
步驟4 IIC LCD2004液晶顯示屏與傳感器擴展板連接
+
步驟4 IIC LCD2004液晶顯示屏與傳感器擴展板連接<br/>
?
將IIC LCD2004液晶顯示屏接到傳感器擴展板v5.0的IIC 接口
+
將IIC LCD2004液晶顯示屏接到傳感器擴展板v5.0的IIC 接口<br/>
?
步驟5 Arduino傳感器擴展板v5.0外部供電
+
步驟5 Arduino傳感器擴展板v5.0外部供電<br/>
?
使用開關(guān)電源(5V給傳感器擴展板v5.0供電,12V給CarDuino Uno控制器供電),紅色接VCC,黑色接GND,(注意區(qū)分正負極),取下傳感器擴展板v5.0的跳線帽,選擇數(shù)字口外部供電,其他擴展口依然是板內(nèi)取電。
+
使用開關(guān)電源(5V給傳感器擴展板v5.0供電,12V給CarDuino Uno控制器供電),紅色接VCC,黑色接GND,(注意區(qū)分正負極),取下傳感器擴展板v5.0的跳線帽,選擇數(shù)字口外部供電,其他擴展口依然是板內(nèi)取電。<br/>
?
步驟6給CarDuino Uno供電
+
步驟6給CarDuino Uno供電<br/>
?
給CarDuino Uno上電(程序之前已經(jīng)下載好了),圖11,按下傳感器擴展板v5.0的復(fù)位鍵,重啟CarDuino Uno控制器,此時IIC LCD2004液晶屏會顯示預(yù)設(shè)的文字信息。
+
給CarDuino Uno上電(程序之前已經(jīng)下載好了),圖11,按下傳感器擴展板v5.0的復(fù)位鍵,重啟CarDuino Uno控制器,此時IIC LCD2004液晶屏會顯示預(yù)設(shè)的文字信息。<br/>
?
[[文件:13K11104.png|700px|有框||安裝后整體效果圖]]
+
[[文件:13K11104.png|600px|有框|居中|安裝后整體效果圖]]
 
==例子程序==
 
==例子程序==
 
<pre style="color:blue">
 
<pre style="color:blue">

2015年9月22日 (二) 13:01的版本

13K11101.png

目錄

產(chǎn)品概述

機械手臂目前在機械人技術(shù)領(lǐng)域中得到廣泛的應(yīng)用,在工業(yè)制造、醫(yī)學治療、娛樂服務(wù)、教學應(yīng)用、軍事以及太空探索等領(lǐng)域都能見到它的身影。雖然大家經(jīng)常在電影或者電視中見過,似曾想過擁有一臺屬于自己的機械臂,因其功能針對性強和高額的售價,使我們望而卻步。現(xiàn)在你不必擔心這個問題了,AS-6D0F鋁合金機械臂套件,可以實現(xiàn)你的機器人夢想。此版說明書主要介紹如何利用4個大按鈕模塊與Arduino Uno控制器之間的通訊直接控制六自由度機械臂并且在LCD2004液晶屏上實時顯示監(jiān)控到的信息,此說明書還介紹Arduino Uno控制器與LCD2004液晶屏及大按鍵之間的接線和調(diào)試過程,按照此說明書的步驟一步一步的組裝完成后,給其上電,通過4個大按鈕模塊就可以輕松實現(xiàn)對六自由度機械臂的控制。

主控器技術(shù)參數(shù)

  1. 主控器:Carduino UNO R3
  2. 微處理器:ATmega328
  3. Flash 內(nèi)存:32 KB (ATmega328 其中0.5 KB 用于引導(dǎo)程序)
  4. 工作電壓:5V
  5. 輸入電壓:接上USB 時無須外部供電或外部7V~12V DC 輸入
  6. 輸出電壓:5V DC 輸出和3.3V DC 輸出和外部電源輸入
  7. 時鐘頻率:16 MHz
  8. 輸入電壓:7-12V(推薦)
  9. 輸入電壓:6-20V(限制)
  10. 支持USB 接口協(xié)議及供電(不需外接電源)
  11. 支持ISP 下載功能
  12. 數(shù)字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

零件列表

13K11102.png

安裝連線

步驟1:CarDuino Uno控制器與傳感器擴展版安裝并給Carduino UNO下載例程
步驟2:按壓式大按鈕模塊與傳感器連接
將4個大按鈕模塊分別接到傳感器擴展板v5.0的4個模擬口A0.A1.A2.A3,作為機械臂的控制按鍵(A0被按下時舵機號從上至下1,A1被按下時舵機號從下至上1,A2被按下時舵機順時針轉(zhuǎn),A3被按下時舵機逆時針轉(zhuǎn))。
步驟3:RB-150MG與傳感器擴展板連接
將底盤到夾持器的舵機順次連接到傳感器擴展板的6個數(shù)字口D4(底盤舵機)D5.D6.D7.D8.D9(夾持器舵機)。

傳感器連接完成效果圖

步驟4 IIC LCD2004液晶顯示屏與傳感器擴展板連接
將IIC LCD2004液晶顯示屏接到傳感器擴展板v5.0的IIC 接口
步驟5 Arduino傳感器擴展板v5.0外部供電
使用開關(guān)電源(5V給傳感器擴展板v5.0供電,12V給CarDuino Uno控制器供電),紅色接VCC,黑色接GND,(注意區(qū)分正負極),取下傳感器擴展板v5.0的跳線帽,選擇數(shù)字口外部供電,其他擴展口依然是板內(nèi)取電。
步驟6給CarDuino Uno供電
給CarDuino Uno上電(程序之前已經(jīng)下載好了),圖11,按下傳感器擴展板v5.0的復(fù)位鍵,重啟CarDuino Uno控制器,此時IIC LCD2004液晶屏會顯示預(yù)設(shè)的文字信息。

安裝后整體效果圖

例子程序

#include <Servo.h>      //調(diào)用一些庫文件
#include <TimedAction.h>
#include <SimpleTimer.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;         //舵機的數(shù)量
const int centerPos =  90;        //舵機中位位置

unsigned long key_millis = 0;      
unsigned long button_millis = 0;
int keyDelay = 100;              //定義延時時間
int buttonDelay = 50;           //定義按鍵延時
int thisServo = base;           //定義起始電機

typedef struct{              //數(shù)組框架結(jié)構(gòu)
  byte neutral;             //中位角度
  byte minPos;             //最小角度
  byte maxPos;            //最大角度
  byte delaySpeed;         //延時時間
  byte curPos;            //舵機當前角度
} ServoPos;              //結(jié)構(gòu)體名稱

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端口開關(guān)設(shè)置0x表示十六進制27轉(zhuǎn)換成16進制數(shù)是00100111  1代表開,0代表關(guān), 20列,4行,行號從零算起,第一行行號0,第二行行號1.
Servo servos[maxServos];
int destServoPos[maxServos];
int currentServoPos[maxServos];

TimedAction servoMove[maxServos] = TimedAction(100, doServoFunc);   // 延時,延時時間為聲明時間。
SimpleTimer timer;            // For movement tests
TimedAction keys = TimedAction(10, keypadFunc);

void setup() {                            //設(shè)置
  delay(200);
  Wire.begin();
  lcd.init();                             //LCD初始化             
  lcd.backlight();                 //LCD背光燈打開
  delay(500);
  lcd.on();                     // LCD開機
  setupDisplay();               //調(diào)用子程序,設(shè)置顯示內(nèi)容門,后面有定義。

  for(int i=0; i<maxServos; i++) {          
    servos[i].write(servosPos[i].neutral);
    servosPos[i].curPos = servosPos[i].neutral;
    servos[i].attach(i+4);
    destServoPos[i] = centerPos;
    currentServoPos[i] = centerPos;
    servoMove[i].disable();
  }
  //timer.setInterval(5000, servoTestFunc);      
}

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 doServoFunc() {
  int x = curServo;      
  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]);
}

void Move(int servoNum, int servoPosition, int delayTime) {  //舵機驅(qū)動指令
  sMove[0] = servoNum;             //所驅(qū)動舵機號
  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);// 設(shè)置顯示位置第4行,3列就是說前面空2格。
  lcd.print(" you are welcome  ");
  lcd.setCursor(6, 2);//pose后面顯示的角度位置。
  lcd.print(pos, DEC); //當按鍵按下后顯示角度值。
  servos[t].write(pos);
}

void setupDisplay() {    //子程序定義,LCD顯示內(nèi)容,開機立即顯示。
  lcd.clear();          //LCD清屏
  lcd.blink_off();       //LCD光標閃爍關(guān)
  lcd.home();         //
  lcd.setCursor(1, 1);  //設(shè)置顯示位置第2行,2列就是說前面空1格。
  lcd.print("key: ");   //顯示內(nèi)容 “key”
  lcd.setCursor(4, 0);   //設(shè)置顯示位置第一行,5列就是說前面空4格。
  lcd.print("alsrobotbase      ");//顯示內(nèi)容”alsrobotbase”
  lcd.setCursor(1, 2);         // 設(shè)置顯示位置
  lcd.print("Pos: ");           //顯示內(nèi)容”Pos”
}

產(chǎn)品相關(guān)推薦

Erweima.png

產(chǎn)品購買地址

AS-6DOF 鋁合金機械臂 Arduino版本

周邊產(chǎn)品推薦

防水舵機

相關(guān)問題解答

arduino六自由機械臂編譯不成功問題
Arduino UNO R3 可以實現(xiàn)機械臂控制嗎?
6自由度機械臂舵機容易被拉下來

相關(guān)學習資料

AS-6DOF鋁合金機械臂功能演示之定位抓取
6自由度機械臂玩兒家測評一
6自由度機械臂玩兒家測評二
奧松機器人技術(shù)論壇