2021年6月6日星期日

arduino robot arm

 

最近也是需要遠端居家上班,但是公司的設備需要有人協助幫忙按按鈕,但由於我又是不太習慣請人幫忙的小RD,於是自己來動手做個遙控手臂,話不多說

上成品






開發環境arduino IDE

 所需材料有

1.   3D 列印機

2.   機械手臂圖檔(請參考文末連結)

3.   一些螺絲螺母M3 M4

4.   伺服馬達4

5.   銼刀(用來修邊)

6.   Arduino NANO Shield

7.   Arduino NANO + Mini USB

 


過程記錄

 

1.      等待漫長的列印

2.      組裝

當印到這兩個的時候記得多印一下,因為一片會太薄,建議使用兩片

這邊可以看到即便我使用到兩片也有些微變形,之前只鎖一片壞掉了沒拍照記錄,可惜

3.      組裝伺服馬達時,切記切記,一定要先確認初始位置,我是都先把馬達設定在90度之後才固定手臂的位置將伺服馬達安裝進去,這也是我初始化的位置。

這邊先講一下使用arduino範例程式,作為伺服馬達的初始化角度


開起來的範例



需修改成如下


4.      組裝好之後就來開始寫程式吧

先想一下我們需要怎麼控制它,由於我們需要遠端控制他到一些指定位置

,那當然要下命令啊,怎麼下呢?當然是透過我們的COMPORT去下命令,有些時候想要它移動快一點,那設定的角度就要大。

分析一下需求,

(1)      指定特定馬達轉動特定角度

(2)      指定定馬達轉動固定角度

5.      開始撰寫程式碼吧

我們先定義代號

M1 代表 一號伺服馬達

M2 代表 二號伺服馬達

M3 代表 三號伺服馬達

 

接著轉動角度為1~180

 

命令格式我們暫且訂為

馬達,愈轉動角度

Ex. M1,90\n 代表一號伺服馬達轉到90度位置

-------------程式碼--------------

#include <Servo.h>


Servo RightLiftServer;  //控制左右

Servo UpDownServer;     //控制上下

Servo Forbackward;      //控制前後

Servo myservo4;  // create servo object to control a servo

String ReciveCmd = "";

int Pos_RightLift = 90;

int Pos_UpDown = 90;

int Pos_Forback = 90;

int Step = 5;


void setup() {

  Serial.begin(9600);

  RightLiftServer.attach(9);

  UpDownServer.attach(6);

  Forbackward.attach(5);

  myservo4.attach(3);

  RightLiftServer.write(90);

  UpDownServer.write(90);

  Forbackward.write(150);

  myservo4.write(90);

}


void control(String Motor, int postion)

{

  if (Motor == "M1")

  {

    RightLiftServer.write(postion);

  }

  else if (Motor == "M2")

  {

    UpDownServer.write(postion);

  }

  else if (Motor == "M3")

  {

    Forbackward.write(postion);

  }

  else if(Motor == "Set")

  {

    Step = postion;

  }

}


void ScanCmd(String StringCmd)

{

  String Motor = "";

  String Str_postion = "";

  int comflag = false;

  int degree = 0;

  if (StringCmd.equals("UP\n"))

  {

    Serial.println("UP\n");

    Pos_UpDown+=Step;

    if (Pos_UpDown >= 180)Pos_UpDown = 180;

    UpDownServer.write(Pos_UpDown);

  }

  else if (StringCmd.equals("Down\n"))

  {

    Serial.println("Down\n");

    Pos_UpDown-=Step;

    if (Pos_UpDown <= 0)Pos_UpDown = 0;

    UpDownServer.write(Pos_UpDown);

  }

  else if (StringCmd.equals("Right\n"))

  {

    Serial.println("Right\n");

    Pos_RightLift+=Step;

    if (Pos_RightLift >= 180)Pos_RightLift = 180;

    RightLiftServer.write(Pos_RightLift);

  }

  else if (StringCmd.equals("Lift\n"))

  {

    Serial.println("Lift\n");

    Pos_RightLift-=Step;

    if (Pos_RightLift <= 0)Pos_RightLift = 0;

    RightLiftServer.write(Pos_RightLift);

  }

  else if (StringCmd.equals("Forword\n"))

  {

    Serial.print("Forword:");

    Pos_Forback+=Step;

    if (Pos_Forback > 179)Pos_Forback = 179;

    Serial.println(Pos_Forback);

    Forbackward.write(Pos_Forback);

  }

  else if (StringCmd.equals("Backword\n"))

  {

    Serial.println("Backword:");

    Pos_Forback-=Step;

    if (Pos_Forback <= 0)Pos_Forback = 0;

    Serial.println(Pos_Forback);

    Forbackward.write(Pos_Forback);

  }

  else if(StringCmd.equals("Postion\n"))

  {

    Serial.print("Pos_RightLift:");

    Serial.println(Pos_RightLift);

    Serial.print("Pos_UpDown:");

    Serial.println(Pos_UpDown);

    Serial.print("Pos_Forback:");

    Serial.println(Pos_Forback);

  }

  else

  {

    for (int i = 0; i < sizeof(StringCmd); i++)

    {

      if (StringCmd[i] == ',')comflag = true;

      if (comflag != true && StringCmd[i] != ',')

        Motor += StringCmd[i];

      else if (comflag == true && StringCmd[i] != ',' && StringCmd[i] != '\n') {

        Str_postion += StringCmd[i];

      }

    }

    Serial.print(Motor + ":");

    Serial.println(Str_postion);

    degree = Str_postion.toInt();

    if (degree > 180)degree = 180;

    else if (degree < 0)degree = 0;

    control(Motor, degree);

  }

}


void loop() {

  if (Serial.available() > 0)

  {

    char recive_char = Serial.read();


    //    Serial.println(recive_char);


    if (recive_char == '\n')

    {

      ReciveCmd += '\n';

      ScanCmd(ReciveCmd);

      ReciveCmd = "";

    }

    else


    {


      ReciveCmd += recive_char;


    }


  }


}

-------------程式碼--------------

問題紀錄

1. 如果你的NANO燒錄不進去,請選擇old Version


2. 小心買到會一直轉的伺服馬達,花錢買經驗,購買時一定要選可以控制角度的,從外觀上還真的看不出來(影片中,寫固定角度一個會固定不動,一個會一直轉)






參考資料

https://www.instructables.com/EEZYbotARM/

 https://www.arduino.cc/reference/en/libraries/servo/


沒有留言:

發佈留言

打賞按讚