顯示包含「伺服馬達」標籤的文章。顯示所有文章
顯示包含「伺服馬達」標籤的文章。顯示所有文章

2025年11月22日星期六

Microbit x MeArm

 最近總算有時間把手邊 MeArm 組完並且跟 microbit 結合,使用遊戲把手無線遙控 MeArm ,看著手臂動作蠻療育的😎



材料準備

  1. microbit V2.21 x 2
  2. MeArm x 1 (包含螺絲及伺服馬達)
  3. GamePad
  4. IObit


目  的

    使用 microbit 遊戲把手,對 MeArm 進行控制

組  裝

    組裝 MeArm 的一些照片,組裝時記得先使用這篇的教學,把馬達控制在 90 度的位置,不然 MeArm 全部組完後會不好調整,細部組裝的部分可以網路搜尋,這裡就不一一放上。


    接下來把伺服馬達的線接到 IObits 板子上,如果使用我的程式拼圖的話,需要依照我的腳位   組裝
    下方的馬達  => IObits 的 6
    左側的馬達  => IObits 的 9
    右側的馬達  => IObits 的 7
    夾子的馬達  => IObits 的 8
    額外的提醒:由於板子上是使用 3.3 V 提供點伺服馬達,會有供電不穩的狀況,建議在3.3 V 的腳位上增加電容。

程式拼圖

    這次就不一一放程式拼圖,有需要的可以參考下面的先前文章

    定義函式


    
    遊戲手把的拼圖
        這裡的廣播群組要設為跟 MeArm 的一樣喔
        補充說明一下,這裡要自行記錄自己的遊戲手把的搖桿數值,每個遊戲手把的數值或略有差異
        P1: 
            搖桿向上數值變小(MINI 25)
            搖桿置中數值(575)
            搖桿向下數值變大(MAX 1021)
        P2: 
            搖桿向右數值變小(MINI 12)
            搖桿置中數值(601)
            搖桿向左數值變大(MAX 1021)

        L:底部馬達左轉
        R:底部馬達右轉
        F:前後馬達向前
        B:前後馬達向後
        O:夾子打開
        C:夾子關閉
        T:手臂上抬
        D:手臂下放
    
    類比讀取引腳 P1 < 300,依照自己的搖桿讀到的數值設定,像我的搖桿搖桿置中數值(575) 往上推的時候數值變小(MINI 25),這裡我就取一個中間值 300 ,代表上推。類比讀取引腳 P1 > 798,搖桿置中數值(575) 往下推的時候數值變小(MAX 1021),這裡取一個中間值 798 ,代表下推。
   

    MeArm 部分

    



實際結果



專案連結



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/


打賞按讚