【教學】Arduino控制伺服馬達,程式線路一手包辦

想要透過伺服馬達來讓你的作品做一些動作,但又不曉得如何控制?

本篇會讓你了解伺服馬達如何跟Arduino連接,並且教你如何寫程式控制伺服馬達轉到指定的角度。

伺服馬達

本篇文章使用 輝盛 9g 小型伺服馬達(舵機) (S版)

材料來源為傑森創工,創客的好朋友👍

硬體介紹

“伺服馬達”或稱”伺服舵機”,其內部是由直流馬達、減速齒輪、位置感測器、電路板組合而成。

我們可以透過傳遞訊號的方式來控制伺服馬達轉到指定角度,並且hold住,跟一般直流馬達不太一樣。

光是可以控制特定角度這項特色,就可以滿足很多動作需求呢,可以用在機器人控制、遙控車方向控制、飛機模型等等。

參考資料: 舵機的內部結構及工作原理

規格注意

我個人在使用時比較會去注意幾個規格,工作電壓扭力轉動角度

要根據你要應用的場合需要多少扭力、動作範圍,來選擇適合的伺服馬達。

輝盛 9g 小型伺服馬達(舵機) (S版)這款來說,其工作電壓4.8V、扭矩1.6kg/cm、轉動角度0~180度,若是用在超過該扭矩的範圍,則會無法動作,甚至造成伺服馬達損壞。

電路連接

伺服馬達一般都會有三條線,信號線、電源線、地線。

這邊要注意,信號線接收的為PWM信號,因此要接到arduino pin腳旁有” ~ “這個符號的腳位上。

Arduino程式

控制一個伺服馬達

#include <Servo.h>

Servo myservo;  //宣告伺服馬達物件

void setup() {
  myservo.attach(9); //伺服馬達信號線腳位
}

void loop() {
  myservo.write(0);  //轉動角度(0~180度)                                  
  delay(3000); 
  myservo.write(180); 
  delay(3000);                           
}

控制多個伺服馬達

#include <Servo.h>

Servo myservo1;  //宣告伺服馬達物件
Servo myservo2;  

void setup() {
  myservo1.attach(9); //伺服馬達信號線腳位
  myservo2.attach(6);
}

void loop() {
  myservo1.write(0);  //轉動角度(0~180度) 
  myservo2.write(180);                                  
  delay(3000); 
  myservo1.write(180); 
  myservo2.write(0);
  delay(3000);                           
}

伺服馬達創作

伺服馬達具有定位的特性,所以很常應用在像是機械手臂、雲台,方向控制等等的作品,下列影片中含有相關有趣的作品~

下列影片為無用盒,這個作品一直是我蠻有興趣的作品,而其中伺服馬達用來打開盒子的上蓋,還有猴子伸出手臂的動作,之後有機會來製作看看。

最後!! 如果你喜歡這篇文章,或是這篇文章對你有幫助的話,也歡迎分享出去給需要的人,訂閱免費電子報獲得最新資訊😄😄😄。

在〈【教學】Arduino控制伺服馬達,程式線路一手包辦〉中有 3 則留言

  1. 桶桶 回覆

    不好意思!請問一下我利用HC-06藍芽模組搭配MG995伺服馬達做一個無限操控的夾具,但在藍芽操控時夾具夾入物件(厚度不同)會因為馬達軸無法轉到程式設定的位置而導致BUG產生(夾子無法在開關、異常開開關關),有試過將夾子卸除,而只有伺服馬達進行時操控時就不會有問題,所以覺得程式可能是主要原因。
    想懇求有什麼解決辦法,就是夾子夾物件時就是將物件夾住,放開就是放開,非常感謝!

    以下是夾子的程式,單純靠角度進行夾合動作。
    void Close()
    {
    myservo.write(160);
    }
    void Open()
    {
    myservo.write(20);

    • Derek Wu 文章作者回覆

      我覺得可能是因為單純靠角度來控制,而又有東西夾住,會讓伺服馬達一直想要到指定位置,導致異常。

      我的建議是:
      1.把馬達的5v額外節電源供應器,這樣比起接aduino,供應的電流可以更大,扭力就會越大,讓馬達更穩定。
      2.把夾取的動作改成,調整式的,就是你可以微調夾取的寬度,這樣就不會因為夾大的物件時,伺服馬達跟設定的角度差異過大。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *