2011年1月23日 星期日

Arduino 筆記 – Lab16 使用可變電阻控制伺服馬達

實驗目的

練習用可變電阻控制伺服馬達(Servo motor)的旋轉角度。

image

材料
  • 麵包板 x 1
  • Arduino 主板 x 1
  • 伺服馬達(Servo Motor) x 1
  • 10k 可變電阻 x 1
  • 單心線 x N
接線

伺服馬達有三條線,電源(紅線)、接地(黑線),以及訊號線。

image

  • 把伺服馬達紅線接到 +5v,黑線接到 GND,訊號線接到 pin 9
  • 可變電阻中間腳位接到類比輸入(Analog Input) pin 0,剩下的兩支腳位,一支接到 5V,另外一支接到 GND

image

電路圖

image

程式碼

RC 伺服馬達(Radio Controlled Servo Motor) 大部份是透過 PWM (Pulse Width Modulation, 脈波寬度調變)來控制,Arduino 裏內建了 Servo Library 讓事情變得很簡單,就算你對 PWM 不熟,也可以很輕鬆地控制伺服馬達。底下的程式碼示範 Servo Library 的使用方法(Servo.pde):

程式說明:

  • L2: 引用 Servo library
  • L5: 利用 Servo 類別建立 myservo 物件
  • L24: 要控制 Servo 旋轉角度,只要呼叫 Servo 的 write() 並傳入指定的角度就可以了,例如 myservo.write(180) 是控制 Servo 轉到 180 度,myservo.write(120) 是控制 Servo 轉到 120 度。

使用可變電阻控制伺服馬達(PotServo.pde):

程式說明:

  • L22: 讀取可變電阻並將讀到的數值(介於 0 到 0123)儲存在 val 變數中
  • L23: 0 到 1023 的數值必須經過數值轉換,依比例轉為 0 到 180 的數值,因為我們的伺服馬達只能在 0 到 180 度之間旋轉。範例程式利用 map() 函式將 0 – 1023 的值對應到 0 -179。
  • L24: 根據讀到的可變電阻值控制 Servo 轉到指定的角度
範例照片/影片

請參考 makezine.com 做的這個影片,影片除了示範伺服馬達的控制外,也講解了線路的接法以及程式碼:

延伸閱讀

20 則留言:

  1. coopermaa你好~~~
    我是你網誌的讀者~Sven

    請問,如果要控制servo旋轉的角速度
    需要用那些函式或是參數來調整呢?

    謝謝

    回覆刪除
  2. 請問Cooper有沒有這方面的經驗呢?
    我在網路上搜尋還沒找到servo控速度的方式@@

    回覆刪除
  3. 一般 180 度的 servo 可以控制旋轉的速度嗎?
    這我不清楚,上次看這篇的說明是 360 度的 servo 才能控制速度:
    http://arduino.cc/en/Reference/ServoWrite

    BTW, 你用的是哪一種 servo?

    回覆刪除
  4. Tower Pro SG91R
    http://goods.ruten.com.tw/item/show?21012186149779

    回覆刪除
  5. 我這就不曉得了,我只玩過 180 度的 servo

    你有沒試過下列:

    myservo.write(0);
    myservo.write(180);
    myservo.write(90);

    用這幾種方式測試,結果分別是什麼?

    回覆刪除
  6. 有阿~~~~這指令就是我驅動servo定位的指令~~
    結果就是最左邊~正中間 最右邊~~~

    回覆刪除
  7. servo 只能定位?
    所以 SG91R 這顆不是 360 度的 servo?

    回覆刪除
  8. 對阿~~這個是180度的~~~

    請問Cooper, 有辦法查自己問過那些問題嗎??

    因為我之前都是點你頁面右邊的Recent Comments

    現在想要回去複習....

    又不知道跑到哪了 XDDDDD

    回覆刪除
  9. 照這篇的說法,好像只有 360 度的 servo 才能控制速度:
    http://arduino.cc/en/Reference/ServoWrite

    沒辦法查耶!我也覺得很困擾...sorry
    坦白說,Google blogger 內建的留言板並不是很理想,不曉得有沒有比較好用的外掛~~

    回覆刪除
  10. 想請問一下~我是新手!!UNO接上servo後 com就會跳掉,是哪裡出了問題嗎?

    回覆刪除
  11. @Ei-Design
    "接上 servo 後 com 就會亂掉" 是什麼狀況?

    回覆刪除
  12. 就是會讀不到port(com),會做動一下,然後就停止了!!

    回覆刪除
  13. 是接上 servo 就會這樣嗎?
    其它程式可以正常跑嗎?

    如果是的話,有可能是電源問題,建議額外供電給 servo

    回覆刪除
  14. 請問一下,我用uno+ ethernet shiled + servo,利用telnet server 讓使用者用telnet的client去控制servo.
    但是只要使用myservo.attach(9);ethernet就會ping 不到.
    請問會是哪裡有問題?
    謝謝.

    回覆刪除
  15. Hi, 你說 "只要使用myservo.attach(9);ethernet就會ping 不到.",那不加這行就 ping 得到嗎?

    回覆刪除
  16. http://www.youtube.com/watch?v=kPDrnYKGsh4

    您好COOPER,我照著上面的第一段語法控制伺服馬達,但是馬達卻會亂抖動,不知道您是否知道原因呢?

    回覆刪除
  17. 可能是供電的問題,建議伺服馬達另外供電,不要共用 Arduino 的電

    回覆刪除
  18. 想問老師,我不用servo motor,改為3v至4.5vdc motor.可以嗎?還需要注意?

    回覆刪除
  19. 可以的
    建議用 L293D 或 L298 控制直流馬達:
    http://gcyrobot.blogspot.tw/2011/05/arduino-h-bridgel293d.html

    回覆刪除

注意:只有此網誌的成員可以留言。