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 意見:

Sven Wang 提到...

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

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

謝謝

Sven Wang 提到...

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

Cooper Maa 提到...

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

BTW, 你用的是哪一種 servo?

Sven Wang 提到...

Tower Pro SG91R
http://goods.ruten.com.tw/item/show?21012186149779

Cooper Maa 提到...

我這就不曉得了,我只玩過 180 度的 servo

你有沒試過下列:

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

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

Sven Wang 提到...

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

Cooper Maa 提到...

servo 只能定位?
所以 SG91R 這顆不是 360 度的 servo?

Sven Wang 提到...

對阿~~這個是180度的~~~

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

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

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

又不知道跑到哪了 XDDDDD

Cooper Maa 提到...

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

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

Ei-Design 提到...

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

Cooper Maa 提到...

@Ei-Design
"接上 servo 後 com 就會亂掉" 是什麼狀況?

Ei-Design 提到...

就是會讀不到port(com),會做動一下,然後就停止了!!

Cooper Maa 提到...

是接上 servo 就會這樣嗎?
其它程式可以正常跑嗎?

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

Steve 提到...

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

Cooper Maa 提到...

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

Adam 提到...

http://www.youtube.com/watch?v=kPDrnYKGsh4

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

Cooper Maa 提到...

可能是供電的問題,建議伺服馬達另外供電,不要共用 Arduino 的電

Unknown 提到...

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

Cooper Maa 提到...

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

Unknown 提到...

thankyou