馬達控制

本篇為伺服馬達控制的學習筆記,共分為兩部分,第一部分為直接控制角度,第二部分以脈衝寬度控制。

控制角度:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <Servo.h>

Servo myservo; // 建立Servo物件,控制伺服馬達

void setup() 
{ 
  myservo.attach(9); // 連接數位腳位9,伺服馬達的訊號線
}

void loop()  
{
  for(int i = 0; i <= 180; i+=1){ // ( int i = 0; )表馬達初始角度為0度
  //(i <= 180; )表馬達最終角度為180度   
  //(i+=1)表示馬達每次正轉1度
    myservo.write(i); // 使用write,傳入角度,從0度轉到180度
    delay(20);    //馬達每0.02秒轉i+的角度
  }
  for(int i = 180; i >= 0; i-=1){   // ( int i = 180; )表馬達初始角度為180度     
  //(i >= 0 ; )表馬達最終角度為0度   
  //(i-=1)表示馬達每次逆轉1度
    myservo.write(i);// 使用write,傳入角度,從180度轉到0度
    delay(20);  //馬達每0.02秒轉i-的角度
  }
}

以脈衝寬度控制 :

馬達脈寬信號為500-1500-2500,對應的角度是-90度~+90度

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <Servo.h>

Servo myservo;

void setup() 
{


  myservo.attach(9, 500, 2400); // 修正脈衝寬度範圍
  myservo.write(90); // 一開始先置中90度
  delay(3000);
}

void loop() 
{
  for(int i = 500; i <= 2500; i+=100){   // ( int i = 500; )表馬達初始訊號為500    
  //(i <= 2500; )表馬達最終訊號為2500   
  //(i+=100)表示馬達每次正轉訊號100所代表的角度
    myservo.writeMicroseconds(i); // 直接以脈衝寬度控制

    delay(300);    //馬達每0.3秒轉i+=100所代表的角度
  }
  for(int i = 2500; i >= 500; i-=100){   // ( int i = 2500; )表馬達初始訊號為2500    
  //(i <= 500; )表馬達最終訊號為500   
  //(i-=100)表示馬達每次反轉訊號100所代表的角度
    myservo.writeMicroseconds(i);

    delay(300);  //馬達每0.3秒轉i-=100所代表的角度
  }
}

來源:

葉難: Arduino練習:伺服馬達以Tower Pro SG90為例

結語:

以控制角度的方法可修改i的數值控制馬達轉角,並可透過修改i+、i-與 delay的值控制馬達旋轉的速度。

以脈衝寬度控制的方法與控制角度的方法很相似,但每一個馬達的脈衝訊號寬度不一樣,還需要以馬達的條件來設定轉角及轉速。


Comments

comments powered by Disqus