2013/09/06

Arduino練習:連續旋轉伺服馬達GWS S35

之前以既小且便宜的伺服馬達Tower Pro SG90為例,這次將練習使用可連續旋轉的伺服馬達,GWS(廣營)的S35。

雖然有很多文章討論如何改造一般的伺服馬達,變成可以連續旋轉,不過我還沒試過。

我是到某拍賣網站購買GWS S35,大約兩百多元。


呃,背面。


附了一張滿詳細的規格說明書,滿不錯的。


螺絲、金屬扣、橡膠減震墊、旋臂。


馬達主體。


一般伺服馬達有三條線,電源(紅色)、接地(黑或棕色)、訊號線(白、黃、橘、藍,甚至是黑色)。

S35三條線的顏色是白、紅、黑,對應訊號、電源、接地。

電路圖如下,訊號線接Arduino數位腳位9。


底下這支程式很簡單,從序列埠接收0~180的值,控制S35的旋轉速度。

#include <Servo.h>

Servo myservo;
 
void setup()
{
  Serial.begin(115200);
  myservo.attach(9);
}

void loop()
{
  int d;
  if(Serial.available()){
    d = Serial.parseInt();
    Serial.println(d);
    if(0 <= d && d <= 180){
      myservo.write(d);
    }
  }
}

請開啟序列埠監控視窗,輸入0~180的值,便會看見伺服馬達以不同轉速、不同方向進行旋轉。

一般傳入0~180給Servo.write時,會控制伺服馬達旋轉到哪個角度,停在那裡,但S35是連續轉動的伺服馬達,0~180代表不同的旋轉速度,0是往某個方向的最快轉速,90代表不動,180則是往另一個方向的最快轉速。

38 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. 你好:

    請問可以控制它旋轉的時間嗎?

    例如說我要它150的轉速然後旋轉三秒就停

    謝謝!

    ReplyDelete
    Replies
    1. 下達myservo.write(150);時,呼叫millis()記錄當時的時間,
      然後不斷地呼叫millis()與之前作比較,若超過三秒就
      呼叫myservo.write(90);停下馬達。

      不過,有時候呼叫write(90)時,馬達仍有可能以非常緩慢的速度轉動,此時可呼叫detach斷開連結(咳咳),也就是不再輸出訊號,那麼馬達就會完全靜止;之後想要再轉動時,就要再呼叫attach才行。

      Delete
  3. 要怎麼改成連續旋轉伺服

    ReplyDelete
    Replies
    1. GWS(廣營)的S35已經是連續旋轉伺服馬達

      Delete
  4. 請問如何控制確切轉速?如我要恰20RPM要如何做呢?

    ReplyDelete
    Replies
    1. 嗯,我不清楚。

      Delete
    2. 如果是連續旋轉伺服馬達,傳給它不同頻率,就會有不同轉速。
      至於如何確切控制,嗯,要自己量吧。

      Delete
  5. Serial.begin(115200);?
    why not 9600

    ReplyDelete
  6. 序列埠監控視窗 輸入 180,60,90...
    會稍做停頓,或反轉,但不久又會跳回0
    這怎麼解決,煩請解答 : )

    ReplyDelete
    Replies
    1. 跳回0?什麼意思?

      GWS S35 是 連續旋轉伺服馬達

      Delete
    2. GWS S35 是 連續旋轉伺服馬達,這點明白
      在馬達運轉中 0跟180分別是反向對吧
      用上述程式(完全沒有改的情形)
      一開始馬達是停止,等待輸入序列埠監控視窗
      但奇怪的是
      無論我輸入0~180任何數字,程式都會跳回(輸入序列埠監控視窗)顯示為零
      如果將程式改成不要用輸入,例如 d=180 或 d=0 可以達到正反轉的要求
      懇請解答

      Delete
    3. 嗯,在序列埠監控視窗底下有個控制換行字元的設定,請改成「No line editing」,這樣應該就可以了。

      Delete
    4. thanks a lot : )

      Delete
  7. 請問一下,我給他輸入0~180的值,他都只會轉同一個方向,請問該如何改成一個值,轉動
    在一個值停止的簡單操作呢?? 語法? 謝謝您

    ReplyDelete
    Replies
    1. GWS S35是連續旋轉的伺服馬達,照理說輸入0應該會正轉,那麼180應該會逆轉。
      而輸入90應該會停止,不過需要測試微調,可能會是93才停止。

      官方說不能控制角度,如果想控制停在某角度,很勉強,
      要自己算時間,而且不精確,
      如果真的要將這個馬達調整到固定的角度時就要去算時間差,不容易。

      Delete
    2. 您好,我試過了,不會反轉,也不會停止耶! @@"
      是不是語法可以改成給個指定的數字指令,讓他直接停止或反轉呢?
      如果我外加藍芽的話,會有影響嗎 ^^"?

      Delete
    3. 你用的是GWS S35?

      正確的話,輸入0~180的值,便會看見伺服馬達以不同轉速、不同方向進行旋轉。而其中某值應會停止。

      藍牙會有什麼影響?

      Delete
  8. 您好,請問一下
    我有想要利用2顆GWS S35做成自走車的車輪馬達
    但是我發現若利用servo.write()去控制的話
    2顆馬達的轉速不會相同
    請問一下應該要怎麼做才可以使得2顆馬達轉速相同呢?
    我有想到使用writeMicrosecond()去控制
    但是又不知道GWS S35的脈衝寬度範圍
    請問您有比較好的建議嗎?

    ReplyDelete
    Replies
    1. 嗯,沒有相關經驗,恐怕無法給予建議。

      轉速不相同,嗯,確認給予相同的電力(電壓、電流)嗎?
      轉速相差很大嗎?

      脈衝寬度範圍,上網找可找到。
      使用writeMicrosecond時,先從1000~2000嘗試,然後逐步加大範圍,若馬達出現怪聲停止,若加大範圍時轉速並未提昇,也應該代表抵達上下限了。

      Delete
    2. 我是利用同一片UNO板,2個數位腳位各接1顆GWS S35
      然後看2顆馬達的轉速是不一樣的
      轉速是不會相差太大,可是用在自走車上怕會有問題

      Delete
    3. 嗯,不清楚。

      調整writeMicrosecond參數值,直到你覺得雙方的轉速相同。大概吧。

      Delete
  9. 請問一下如果要用按鈕控制的話可以嗎??

    ReplyDelete
  10. 大概就是用三個按鈕來控制GWS S35的0 90 180
    不知道行不行得通 懇請解惑感恩

    ReplyDelete
    Replies
    1. 可以啊。有什麼問題嗎?

      你說的是需求,不是問題。

      Delete
    2. 那使用用程式的話要如何控制呢?
      不知道要如呵將90 0 180 變成可以用按鈕控制的程式
      謝謝

      Delete
    3. 用digitalRead讀取按鈕狀態
      根據按下哪個按鈕
      以analogWrite輸出對應的PWM訊號控制伺服馬達

      Delete
  11. 請問如果要同時供應給,兩個 S35 需要如何供電
    Arduino 本身電力不夠 =>
    1.可以改接兩個18650嗎?
    2.兩個18650為7.2V 需不需要穩壓到5V
    3.若四個 S35 又要如何供電呢?
    謝謝您

    ReplyDelete
    Replies
    1. 1. 可以
      2. 當然要
      3. 計算所有馬達需要的電流上限,挑選能夠輸出那麼大電流的穩壓器

      Delete
  12. 如果是306的伺服馬達 我想讓它轉2圈停下來要怎麼控制??

    ReplyDelete
  13. 請問一下 如果想讓光敏電阻所接受到的數值來控制伺服馬達轉動角度 該怎麼做

    ReplyDelete
  14. 參考這篇 http://yehnan.blogspot.tw/2012/02/arduino_23.html 讀取光敏電阻的值,
    然後使用map,把值的範圍轉成伺服馬達的角度,
    然後用Servo的write寫入。

    ReplyDelete
  15. 請問一下能夠用PWM去控制伺服馬達所轉的角度嗎!?

    ReplyDelete
    Replies
    1. 這是連續旋轉的伺服馬達,很難吧,我不知道怎麼做。

      Delete
  16. 請問可以控制它旋轉的時間嗎?
    例如說我要它150的轉速然後旋轉三秒就停 再反轉旋轉三秒
    有完整的code 碼
    用來收窗簾用

    ReplyDelete
  17. 請問,我加入了millis()
    仍無法再指定的轉速下執行3秒
    還是得再輸入90才會停止
    請問程式碼的部分哪裡該修正呢?
    謝謝


    #include

    Servo myservo;
    long previousTime = 0;
    long interval = 3000;

    void setup()
    {
    Serial.begin(9600);
    myservo.attach(9);
    }

    void loop()
    {
    int d;
    unsigned long currentTime= millis();
    if(Serial.available()){
    d = Serial.parseInt();
    Serial.println(d);
    if(0 <= d && d <= 180){
    myservo.write(d);
    if(currentTime - previousTime > interval){
    myservo.write(90);
    }
    }
    }
    previousTime = currentTime;
    }

    ReplyDelete