吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Delta并聯機械臂實現電磁鐵搬運功能

jf_72402704 ? 來源:jf_72402704 ? 作者:jf_72402704 ? 2023-03-09 08:43 ? 次閱讀

1. 功能說明

R037樣機是一款Delta并聯機械臂。本文示例將利用Delta并聯機械臂實現不同點定點搬運磁鐵物料的效果。

pYYBAGQJK5uAMbQAAABfJhtrhgI745.jpg

2. 結構說明

Delta并聯機械臂,其驅動系統采用精度較高的42步進電機;傳動系統為絲杠和萬向球節;執行末端為搭載電磁鐵的圓盤支架。

pYYBAGQJKVuAICV5AARGsH-mE1k584.png

3. Delta機械臂運動學算法

這里給大家介紹一種Delta并聯機械臂的運動軌跡解法,通過控制電機的轉動參數,最終求解出電磁鐵圓盤支架的運動軌跡規律,樣機采用R037b

poYBAGQJKXCAN-wXAAFL45E1Q-E081.png

該機械臂由3個絲杠平臺構成,通過并聯的方式同時控制同一個端點的運動;三個絲杠位于一個正三角形邊線的中心位置,連桿采用球頭萬向節連桿結構。

poYBAGQJK5uAbxf6AAAgQMq7HqM453.png

① 首先我們建立一個空間直角坐標系,該直角坐標系以三個絲杠平臺在俯視圖方向投影的內切圓心為原點,x軸與tower1和tower3之間的連線平行,y軸過tower2,其中z=0的平面設置在三個限位開關所在平面。

pYYBAGQJK5yAcdU1AAAbthQ72rE760.png

② 建立坐標系之后,我們可以得出3個限位開關Z軸投影的坐標為A=(-msin(60°),mcos(60°),0);B=(0,m,0);C=(msin(60°),mcos(60°),0);其中m為在xy投影面上正三角形的內切圓心到B點的距離。

poYBAGQJK5yALokLAAAZKm0y0Ts252.png

③確定各限位開關的位置(即確定各絲杠平臺上滑塊的初始位置),絲杠平臺的運動可簡化為如下:【其中N點為滑塊初始位置,Q點為端點初始位置,P為Q點在絲杠平臺上Z軸的投影;N1,P1,Q1點為絲杠平臺運動后的位,T點為某一固定點,假設為delta機械臂上端點在Z向可以運動的最大值在絲杠平臺Z向的投影點】

pYYBAGQJK52AFulfAAAfxhEVPf0396.png

④逆運動學是根據Q1點的位置確定NN1的距離。

在圖中有幾個可以通過測量得到已知值,分別是連桿長度NQ/N1Q1、NT的距離、終點Q1點的坐標;假設我們輸入的量是終點Q1的坐標(X1,Y1,Z1);這里需要注意的是Z1坐標為負值,為了方便理解在后面的推導中我們都對Z1取絕對值。

我們需要計算的是NN1的距離:

poYBAGQJK52Aa3sOAAABFroLaNQ461.png

其中Q1的Z坐標與P1的Z坐標一致,所以NP1為已知量為Q1的Z坐標值Z1,即可以將上面的公式改為:

pYYBAGQJK52AGjT5AAABMBclx8I351.png

這里我們只需要計算出N1P1的值即可:

poYBAGQJK56AYwnjAAABpFtA0Q0366.png

其中NIQ1為連桿長度,可通過測量得知,所以這里面需要我們計算出Q1P1。

⑤求出Q1P1:【該長度我們可以通過兩點坐標距離公式得出,借助俯視圖投影進行計算】

pYYBAGQJK56AZDiqAAAc2FDp9gM993.png

為方便計算Q1P1,圖中我們將N,N1,P,P1,T點都投影到Z為0的點,則Q1(X1,Y1,0)。

根據點坐標公式可得:

poYBAGQJK5-AQDjGAAACiKVuAGQ210.png

綜上所述:

pYYBAGQJK5-ASqq9AAAC6OUQZ4o422.png

注意前面我們對Z1取了一次絕對值,實際Z1為負值,

所以最終推導公式為:

poYBAGQJK5-AAMfnAAAC-qjn1AI040.png

這樣我們就求出了NN1(絲杠移動距離)與Q1(執行端運動的終點)坐標的關系。

4. 功能實現

4.1 電子硬件

在這個示例中,我們采用了以下硬件,請大家參考:

主控板 Basra主控板(兼容Arduino Uno)
擴展板 Bigfish2.1
SH-ST擴展板
傳感器 觸碰傳感器
電機 步進電機
電池 11.1v動力電池
其它 電磁鐵、USB

4.2 電路連接說明

① 硬件連接-電子元件

pYYBAGQJK6CALIDwAABG5D41dK0728.png

各軸步進電機與SH-ST步進電機擴展板的接線順序如下(從上至下):
X:紅藍黑綠

Y:紅藍黑綠

Z:黑綠紅藍

② 硬件連接-限位傳感器

poYBAGQJK6CAEaQFAABdeAtrUbI087.png

各個軸的限位傳感器(觸碰)與Bigfish擴展板的接線如下:
X:A0

Y:A3

Z:A4

③ 電磁鐵連在Bigfish擴展板的D5、D6接口上。

4.3 編寫程序

編程環境:Arduino 1.8.19

Delta機械臂有兩種運動方式:第一種是自動運行搬運;第二種是用電腦發送指令,然后再根據指令運動。

這里僅列出Delta機械臂自動運行搬運(Delta.ino)的程序:【其它的程序源碼詳見 https://www.robotway.com/h-col-194.html 獲取】

/*------------------------------------------------------------------------------------

  版權說明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

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

           https://opensource.org/licenses/MIT

           by 機器譜 2023-02-08 https://www.robotway.com/                                 

------------------------------------------------------------------------------------*/

#include "Arduino.h"

#include 

#include 

#include "Configuration.h"


AccelStepper stepper_x(1, 2, 5);      //tower1

AccelStepper stepper_y(1, 3, 6);      //tower2

AccelStepper stepper_z(1, 4, 7);      //tower3

//AccelStepper stepper_a(1, 12, 13);


MultiStepper steppers;


float delta[NUM_STEPPER];                         

float cartesian[NUM_AXIS] = {0.0, 0.0, 0.0};         //當前坐標

float destination[NUM_AXIS];                         //目標坐標

boolean dataComplete = false;


float down = -111;

float up = -105;


/*********************************************Main******************************************/

void setup() {

  Serial.begin(9600);

  pinMode(EN, OUTPUT);


  steppers.addStepper(stepper_x);

  steppers.addStepper(stepper_y);

  steppers.addStepper(stepper_z);


  stepperSet(1600, 400.0);

  stepperReset();

  delay(1000);


  Get_command(0, 0, down);

  Process_command();

 

  delay(1000);

}


void loop() {

  float r = 25;

  float x1 = 0.0;

  float y1 = 0.0;


  Get_command(25, 0, down);

  Process_command();

  delay(1000);

 

  for(int i=0;i<2;i++){

    for(float i=0.0;i<=360;i+=10){

      x1 = r * cos(i / 180 * 3.141592);

      y1 = r * sin(i / 180 * 3.141592);

     

      Get_command(x1, y1, down);

      Process_command();                                     

    }

  }

  delay(1000);


  for(int j=0;j<2;j++){

    for(float i=360.0;i>=0;i-=10){

      x1 = r * cos(i / 180 * 3.141592);

      y1 = r * sin(i / 180 * 3.141592);

     

      Get_command(x1, y1, down);

      Process_command();                                     

    }

  }

  delay(1000);




  Get_command(0, 0, down);

  Process_command();  

 

  test();

  delay(1000);

 

  stepperReset();

  delay(1000);

 

}


/***************************************Get_commond*******************************************/

void Get_command(float _dx, float _dy, float _dz){  

  destination[0] = _dx;

  destination[1] = _dy;

  destination[2] = _dz;

 

  if(destination[0] == 0 && destination[1] == 0 && destination[2] == 0){

      stepperReset();  

  }

  else

  {

      dataComplete = true;

  }

 

  if(serial_notes){

   Serial.print("destinationPosition: ");

   Serial.print(destination[0]);

   Serial.print(" ");

   Serial.print(destination[1]);

   Serial.print(" ");

   Serial.println(destination[2]);

  }


}


/***************************************Process_command***************************************/

void Process_command(){

  if(dataComplete){

    digitalWrite(EN, LOW);

   

    if(cartesian[0] == destination[0] && cartesian[1] == destination[1] && cartesian[2] == destination[2]){

      return;  

    }

    else

    {


      Line_DDA(destination[0], destination[1], destination[2]);

    }

   

  }

  dataComplete = false;

  digitalWrite(EN, HIGH);

}


/************************************************** DDA ************************************************/

void Line_DDA(float x1, float y1, float z1)

{

  float x0, y0, z0;         // 當前坐標點

  float cx, cy;             // x、y 方向上的增量

 

  x0 = cartesian[0];y0 = cartesian[1];z0 = cartesian[2];

   

  int steps = abs(x1 - x0) > abs(y1 - y0) ? abs(x1 - x0) : abs(y1 - y0);

 

  cx = (float)(x1 - x0) / steps;

  cy = (float)(y1 - y0) / steps;

 

  for(int i = 0; i <= steps; i++)

  {

    cartesian[0] = x0 - cartesian[0];

    cartesian[1] = y0 - cartesian[1];

    cartesian[2] = z1 - cartesian[2];


    calculate_delta(cartesian);

   

    stepperSet(1350.0, 50.0);

    stepperMove(delta[0], delta[1], delta[2]);

 

    cartesian[0] = x0;

    cartesian[1] = y0;

    cartesian[2] = z1;

 

    x0 += cx;

    y0 += cy;

   

    if(serial_notes){

      Serial.print("currentPosition: ");

      for(int i=0;i<3;i++){

         Serial.print(cartesian[i]);

         Serial.print(" ");

      }   

      Serial.println();

      Serial.println("-------------------------------------------------");

    }


  }


}


/***************************************calculateDelta****************************************/

void calculate_delta(float cartesian[3])

{

  if(cartesian[0] == 0 && cartesian[1] == 0 && cartesian[2] == 0){

      delta[0] = 0; delta[1] =0; delta[2] = 0;

  }

  else

  {

      delta[TOWER_1] = sqrt(delta_diagonal_rod_2

                       - sq(delta_tower1_x-cartesian[X_AXIS])

                       - sq(delta_tower1_y-cartesian[Y_AXIS])

                       ) + cartesian[Z_AXIS];

      delta[TOWER_2] = sqrt(delta_diagonal_rod_2

                       - sq(delta_tower2_x-cartesian[X_AXIS])

                       - sq(delta_tower2_y-cartesian[Y_AXIS])

                       ) + cartesian[Z_AXIS];

      delta[TOWER_3] = sqrt(delta_diagonal_rod_2

                       - sq(delta_tower3_x-cartesian[X_AXIS])

                       - sq(delta_tower3_y-cartesian[Y_AXIS])

                       ) + cartesian[Z_AXIS];


     for(int i=0;i<3;i++){

        delta[i] = ((delta[i] - 111.96) * stepsPerRevolution / LEAD);

     }

  }


  if(serial_notes){

      Serial.print("cartesian x="); Serial.print(cartesian[X_AXIS]);

      Serial.print(" y="); Serial.print(cartesian[Y_AXIS]);

      Serial.print(" z="); Serial.println(cartesian[Z_AXIS]);

   

      Serial.print("delta tower1="); Serial.print(delta[TOWER_1]);       

      Serial.print(" tower2="); Serial.print(delta[TOWER_2]);

      Serial.print(" tower3="); Serial.println(delta[TOWER_3]);

  }


}


/****************************************stepperMove******************************************/

void stepperMove(long _x, long _y, long _z){             

    long positions[3];

    positions[0] = _x;                        //steps < 0, 向下運動 ; steps > 0, 向上運動

    positions[1] = _y;

    positions[2] = _z;


    steppers.moveTo(positions);

    steppers.runSpeedToPosition();


    stepper_x.setCurrentPosition(0);

    stepper_y.setCurrentPosition(0);

    stepper_z.setCurrentPosition(0);

}


/****************************************stepperSet******************************************/

void stepperSet(float _v, float _a){

  stepper_x.setMaxSpeed(_v);                  //MaxSpeed: 650

  stepper_x.setAcceleration(_a);  

  stepper_y.setMaxSpeed(_v);

  stepper_y.setAcceleration(_a);

  stepper_z.setMaxSpeed(_v);

  stepper_z.setAcceleration(_a);


}


/****************************************stepperReset******************************************/

void stepperReset(){

  digitalWrite(EN, LOW);

 

  if(cartesian[2] != 0){

    Get_command(0, 0, cartesian[2]);

    Process_command();

    digitalWrite(EN, LOW);

  }

 

  while(digitalRead(SENSOR_TOWER1) && digitalRead(SENSOR_TOWER2) && digitalRead(SENSOR_TOWER3)){

    stepperMove(10, 10, 10);

  }


  stepperSet(1200.0, 100.0);

  stepperMove(-400, 0, 0);

  while(digitalRead(SENSOR_TOWER1)){

    stepperMove(10, 0, 0);

   

  }


  stepperMove(0, -400, 0);

  while(digitalRead(SENSOR_TOWER2)){

    stepperMove(0, 10, 0);

  }


  stepperMove(0, 0, -400);

  while(digitalRead(SENSOR_TOWER3)){

    stepperMove(0, 0, 10);

  }


  for(int i=0;i<3;i++){

     cartesian[i] = 0.0;

  }  


  if(serial_notes) Serial.println("resetComplete!");


  digitalWrite(EN, HIGH);

}


/*************************************************** electromagnet *************************************************************/

void putUp(){

   digitalWrite(9, HIGH);

   digitalWrite(10, LOW);

}


void putDown(){

   digitalWrite(9, LOW);

   digitalWrite(10, LOW);

}


/**************************************************   test    ******************************************************************/

void test(){

    Get_command(0, 0, down);

    Process_command();

    delay(500);

    putUp();

 

    Get_command(0, 0, up);

    Process_command();  

    Get_command(25, 0, up);

    Process_command();


    Get_command(25, 0, down);

    Process_command();  

    putDown();

    delay(500);

    putDown();

    putUp();


    Get_command(25, 0, up);

    Process_command();   

    Get_command(0, 25, up);

    Process_command();   


    Get_command(0, 25, down);

    Process_command();

    putDown();  

    delay(500);

    putDown();

    putUp();


    Get_command(0, 25, up);

    Process_command();   

    Get_command(-25, 0, up);

    Process_command();   


    Get_command(-25, 0, down);

    Process_command();  

    putDown();

    delay(500);

    putUp();


    Get_command(-25, 0, up);

    Process_command();   

    Get_command(0, -25, up);

    Process_command();   


    Get_command(0, -25, down);

    Process_command();  

    putDown();

    delay(500);

    putUp();


    Get_command(0, -25, up);

    Process_command();   

    Get_command(25, 0, up);

    Process_command();   


    Get_command(25, 0, down);

    Process_command();   

    putDown();

    delay(500);

    putUp();


    Get_command(25, 0, up);

    Process_command();   

    Get_command(0, 0, up);

    Process_command();   


    Get_command(0, 0, down);

    Process_command();   

    delay(500);

    putDown();

}

5. 擴展

下圖是另一種外觀的Delta機械臂(R037c),控制原理完全一樣。

pYYBAGQJK6GAAjttAABPVE8ct9U363.jpg

審核編輯黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電磁鐵
    +關注

    關注

    2

    文章

    169

    瀏覽量

    14952
  • Delta
    +關注

    關注

    1

    文章

    29

    瀏覽量

    12323
  • 機械臂
    +關注

    關注

    12

    文章

    520

    瀏覽量

    24725
收藏 人收藏

    評論

    相關推薦

    完美CP來啦!當AGV遇上機械

    AGV+機械復合機器人逐漸打開市場,實現物料自動搬運、上下料、分揀等“無人搬運”。結合信息系統運作,調度人員下達指令,
    的頭像 發表于 01-16 18:12 ?108次閱讀
    完美CP來啦!當AGV遇上<b class='flag-5'>機械</b><b class='flag-5'>臂</b>!

    RK3568國產實驗箱+人工智能機械:跳舞、疊羅漢、夾方塊、積木搬運案例全解!

    基于語音控制實現機械特定動作的方法。三、實驗原理程序功能通過語音控制機械
    的頭像 發表于 12-12 19:01 ?450次閱讀
    RK3568國產實驗箱+人工智能<b class='flag-5'>機械</b><b class='flag-5'>臂</b>:跳舞、疊羅漢、夾方塊、積木<b class='flag-5'>搬運</b>案例全解!

    機械的高效運作,連接器起關鍵作用

    ? ? ?機械是靈活且可編程的自動化設備,在工業生產中發揮著至關重要的作用。其廣泛的應用領域涵蓋了裝配與搬運、焊接與噴涂、檢測與測量、碼垛等多個環節,極大地提升了生產效率與質量,并成功替代人工完成
    的頭像 發表于 11-11 18:07 ?353次閱讀

    機器視覺運動控制一體機在DELTA并聯機械手視覺上下料應用

    機器視覺運動控制一體機在DELTA并聯機械手視覺上下料的應用
    的頭像 發表于 10-24 09:02 ?496次閱讀
    機器視覺運動控制一體機在<b class='flag-5'>DELTA</b><b class='flag-5'>并聯機械</b>手視覺上下料應用

    鐵芯長短與電磁鐵磁力大小的關系

    鐵芯長短與電磁鐵磁力大小的關系是一個重要的電磁學問題,它涉及到電磁鐵的工作原理以及磁場在鐵芯中的分布和增強機制。 一、理論分析 1. 電磁鐵的基本原理
    的頭像 發表于 08-21 09:35 ?2579次閱讀

    OrangePi AIpro應用:機械應用開發指南

    眾多與會者的駐足關注,他們對這款智能機械表現出極大的熱情。此款機械能對積木顏色進行識別,將積木搬運到對應區域,可應用于垃圾分揀及工業、物
    的頭像 發表于 08-19 16:42 ?663次閱讀
    OrangePi AIpro應用:<b class='flag-5'>機械</b><b class='flag-5'>臂</b>應用開發指南

    C#之Delta并聯機械手的視覺同步分揀

    Delta并聯機械手視覺識別后如何在流水線進行物料的同步分揀。
    的頭像 發表于 07-03 09:52 ?1232次閱讀
    C#之<b class='flag-5'>Delta</b><b class='flag-5'>并聯機械</b>手的視覺同步分揀

    電磁式繼電器是如何工作的

    電磁式繼電器是一種利用電磁原理來實現控制和保護電路的電器元件。它主要由電磁鐵、觸點系統、彈簧和外殼等部分組成。本文將詳細介紹電磁式繼電器的工
    的頭像 發表于 06-29 09:26 ?1171次閱讀

    干貨!國產Cortex-A55人工智能實驗箱機械積木搬運實驗案例

    TL3568-PlusTEBAI人工智能實驗箱重磅襲來!基于Python機械積木搬運一、實驗目的本實驗通過TL3568-PlusTEB教學實驗箱操作機械
    的頭像 發表于 06-27 08:32 ?968次閱讀
    干貨!國產Cortex-A55人工智能實驗箱<b class='flag-5'>機械</b><b class='flag-5'>臂</b>積木<b class='flag-5'>搬運</b>實驗案例

    電磁繼電器工作電路分為哪兩部分

    電磁繼電器是一種利用電磁原理來實現控制電路的開關元件。它主要由電磁鐵、觸點系統和機械結構三部分組成。電磁
    的頭像 發表于 06-21 09:45 ?807次閱讀

    電磁繼電器分為哪兩個電路

    電磁繼電器是一種利用電磁原理實現控制的電器,廣泛應用于自動控制系統和遠程控制系統中。它主要由電磁鐵、觸點系統和機械部件組成。
    的頭像 發表于 06-21 09:28 ?831次閱讀

    電磁繼電器的原理是什么?為什么要使用電磁繼電器?

    電磁繼電器是一種利用電磁原理實現控制和保護的電器元件。它主要由電磁鐵、觸點系統、彈簧等部分組成。電磁繼電器的工作原理是利用
    的頭像 發表于 06-21 09:24 ?2361次閱讀

    電磁繼電器的工作電路由什么和什么構成

    電磁繼電器主要由控制電路和工作電路兩部分組成。控制電路由電磁鐵、觸點、線圈等組成,工作電路由觸點、負載等組成。當控制電路通電時,電磁鐵產生磁場,吸引觸點,使觸點閉合,從而實現對工作電
    的頭像 發表于 06-21 09:23 ?1106次閱讀

    Lake Shore 電磁鐵電源 643發生故障了如何維修

    Lake Shore電磁鐵電源643是一款高性能、高精度的電磁鐵電源設備,能夠滿足各種電磁鐵應用的需求。其高精度控制、快速極性反轉和高可靠性等特點,使其成為物理材料性能表征、磁學實驗等領域的理想選擇
    的頭像 發表于 05-28 14:05 ?419次閱讀
    Lake Shore <b class='flag-5'>電磁鐵</b>電源 643發生故障了如何維修

    【科準測控】電磁鐵力特性測試方法和設備介紹!

    最近,我們接到了一位客戶的咨詢,他們希望對電磁鐵進行力-位移測試、力-電流測試以及響應時間測試,以評估其在實際應用中的表現。這種測試不僅可以幫助客戶了解電磁鐵在不同工作條件下的性能表現,還能為他們
    的頭像 發表于 03-20 17:41 ?1255次閱讀
    【科準測控】<b class='flag-5'>電磁鐵</b>力特性測試方法和設備介紹!
    永利娱乐场| 最佳场百家乐的玩法技巧和规则| 百家乐作弊视频| 24山向什么最好| 百家乐资金注码| 金彩百家乐官网的玩法技巧和规则 | 百家乐技巧心得| 赌场百家乐规则| 百家乐诀| 百家乐官网如何投注技巧| 临江市| 百家乐官网澳门路规则算法| 7人百家乐官网中号桌布| 真人百家乐官网蓝盾娱乐平台| 百家乐官网娱乐网开户| 百家乐官网14克粘土筹码| 百家乐网络赌博地址| 五星百家乐的玩法技巧和规则| 威尼斯人娱乐城注册送彩金| 顶级赌场官方| 百家乐官网怎么玩呀| 澳门百家乐官网职业赌客| 十六浦百家乐官网的玩法技巧和规则 | 百家乐扎金花斗地主| 永利高娱乐场| 足球比分直播| 在线百家乐官网3d| 博发百家乐官网的玩法技巧和规则| 百家乐视频小游戏| 百家乐娱乐分析软件v| 大发888娱乐场 888| 南川市| 金百家乐官网的玩法技巧和规则 | 凯斯百家乐的玩法技巧和规则| 九游棋牌大厅| 任我赢百家乐官网自动投注系统 | 百家乐官网技论坛| 百家乐知敌便能制胜| 威尼斯人娱乐网| 海阳市| 真人百家乐官网作|