2012-06-05 01:28:16 小鯨魚

Arduino控制SERVO

SERVO的控制對Arduino來說很容易
只要是標準的PWM SERVO不管多大多小顆都可以搞定

先來看個小程式

#include
 
Servo myservo;
 
int pos = 0;
 
void setup()
{
  myservo.attach(9);  // 328的腳位, 3.5.6.9.10.11預設都直接支援PWM 500HZ頻率,其他腳位要模擬
}
  
void loop()
{
  for(pos = 0; pos < 180; pos += 1) 
  {                                 
    myservo.write(pos);             
    delay(15);                      
  }
  for(pos = 180; pos>=1; pos-=1)  
  {                               
     myservo.write(pos);          
    delay(15);                    
  }
}


這是引用自官網的程式範例
SERVO的正負就看需要多少電壓給電,負極要和arduino共接,Signal接到digital 9的位置
這程式執行以後就會看到SERVO左右擺來擺去!!!
當然,真的照著這樣做,可能SERVO就燒了XDD

因為SERVO的左右極限角度每一顆都不太相同,一般至少左右60度,共120度
若照上面的程式直接跑,有些SERVO會卡住,甚至燒毀!!! 這是必須注意的
使用前必須確實搞清楚SERVO的角度極限來修改上面的程式
一般我兩個迴圈會分別改為
  for(pos = 30; pos < 150; pos += 1) 
 
  for(pos = 150; pos>=30; pos-=1) 

 

其他功能
servo.read()  可以取得該SERVO目前的角度,關於這個功能常有爭議,使用者特愛跟鯨魚番這個,
請勿相信,這指令只是讓你取得之前透過myservo.write(pos) 寫入的位置
並不是讓你取得現在的SERVO位置,這完全是兩回事,SERVO到底有沒有在那個位置上並不能確定
能取得目前位置的SERVO通常都很貴,構造也不太一樣,並不能簡單的使用這種方式取得
EX:有些馬達是利用先給一個時段的0.3ms之類的HIGH態PWM,然後量取傳回的HIGH或LOW的時間來取得目前SERVO位置
EX:有些馬達是利用UART通訊方式來取得

servo.writeMicroseconds(uS) 這是很讚的功能,讓我們能很直覺的使用PWM去寫,對於不同特性的SERVO很好用


其實,關於如何便宜的獲取SERVO目前位置的部分,鯨魚也常常對SERVO惡搞
使用便宜的SERVO,拆了他,把電位器的腳位拉出來接到arduino的digital腳位,就可以輕易的取得目前的SERVO位置
就可以使用便宜SERVO作到很貴的SERVO的功能了
只是這樣做得要很麻煩的:拆SERVO-->拉線-->接arduino-->改程式....搞得很複雜
專用來對付預算不夠的專案到是很好用的^__^a