【雕爺學編程】Arduino動手做(167)---MG996R金屬齒輪舵機

37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑑於本人手頭積累了一些傳感器和執行器模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流爲目的,這裏準備逐一動手試試多做實驗,不管成功與否,都會記錄下來——小小的進步或是搞不掂的問題,希望能夠拋磚引玉。

【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗一百六十七:180度單軸舵機 MG996R伺服電機 13KG智能小車機器人機械手臂DIY雲臺配件

知識點:舵機是什麼?
伺服電機通常被稱爲舵機,它是一種帶有輸出軸的小裝置。當我們向伺服器發送一個控制信號時,輸出軸就可以轉到特定的位置。只要控制信號持續不變,伺服機構就會保持軸的角度位置不改變。如果控制信號發生變化,輸出軸的位置也會相應發生變化。
 
舵機是一種位置伺服的驅動器,主要是由外殼、電路板、無核心馬達、齒輪與位置檢測器所構成。其工作原理是由接收機或者單片機發出信號給舵機,其內部有一個基準電路,產生週期爲20ms,寬度爲1.5ms 的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。經由電路板上的IC 判斷轉動方向,再驅動無核心馬達開始轉動,透過減速齒輪將動力傳至擺臂,同時由位置檢測器送回信號,判斷是否已經到達定位。適用於那些需要角度不斷變化並可以保持的控制系統。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差爲0,電機停止轉動。一般舵機旋轉的角度範圍是0 度到180 度。
 
日常生活中,舵機常被用於遙控飛機、遙控汽車、機器人等領域。舵機在機器人領域非常有用。因爲舵機有內置的控制電路,它們的尺寸雖然很小,但輸出力夠大。像Futaba S-148這樣的標準舵機能提供 0.3牛/米的扭矩,相對於它的外形大小來說這已經足夠強大了。同時,舵機消耗的能量與機械負荷成正比。因此,一個輕載的舵機系統不會消耗太多的能量。
 

工作原理
舵機安裝了一個電位器(或其它角度傳感器)檢測輸出軸轉動角度,控制板根據電位器的信息能比較精確的控制和保持輸出軸的角度。這樣的直流電機控制方式叫閉環控制,所以舵機更準確的說是伺服馬達,英文 servo.舵機組成: 舵盤、 減速齒輪、 位置反饋電位計、直流電機、 控制電路板等。控制電路板接受來自信號線的控制信號,控制電機轉動,電機帶動一系列齒輪組,減速後傳動至輸出舵盤。舵機的輸出軸和位置反饋電位計是相連的,舵盤 轉動的同時,帶動位置反饋電位計,電位計將輸出一個電壓信號到控制電路板,進行反饋,然後控制電路板根據所在位置決定電機轉動的方向和速度,從而達到目標停止。其工作流程爲:控制信號→控制電路板→電機轉動→齒輪組減速→舵盤轉動→位置反饋電位計→控制電路板反饋。

 

機的閉環檢測機制
關於舵機的精準位置控制,存在以下如下圖的閉環控制機制。即:位置檢測器(角度傳感器)是它的輸入傳感器,舵機轉動的位置變化,位置檢測器的電阻值就會跟着變化。通過控制電路讀取該電阻值的大小,就能根據阻值適當調整電機的速度和方向,使電機向指定角度旋轉。從而實現了舵機的精確轉動的控制。

 

舵機的控制信號
爲週期是20ms的脈寬調製(PWM)信號,其中脈衝寬度從0.5ms-2.5ms,相對應舵盤的位置爲0-180度,呈線性變化。也就是說,給它提供一定的脈寬,它的輸出軸就會保持在一個相對應的角度上,無論外界轉矩怎樣改變,直到給它提供一個另外寬度的脈衝信號,它纔會改變輸出角度到新的對應的位置上。舵機內部有一個基準電路,產生週期20ms,寬度1.5ms的基準信號,有一個比較器,將外加信號與基準信號相比較,判斷出方向和大小,從而產生電機的轉動信號。由此可見,舵機是一種位置伺服的驅動器,轉動範圍不能超過180度,適用於那些需要角度不斷變化並可以保持的驅動當中。比方說機器人的關節、飛機的舵面等。

Arduino實驗接線示意圖

【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)

實驗一百六十七:180度單軸舵機 MG996R伺服電機 13KG智能小車機器人機械手臂DIY雲臺配件

項目:簡單控制舵機MG966R

Arduino實驗開源代碼

 

/*

 【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)

  項目:簡單控制舵機MG966R

*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

void setup() {

  myservo.attach(9, 600, 2300);  // (pin, min, max)

}

void loop() {

  myservo.write(0);  // tell servo to go to a particular angle

  delay(500);

  myservo.write(90);

  delay(500);

  myservo.write(180);

  delay(500);

  myservo.write(90);

  delay(500);

}

  Arduino實驗場景圖

 

代碼的工作原理
第一步是包含所需的Arduino庫。您還可以在“文件>示例>Servo”下找到此庫。

 

// Include the servo library:
#include <Servo.h>

接下來,您需要創建 Servo 類的新對象。在這種情況下,稱舵機爲“myservo”,但您也可以使用其他名稱。請注意,您還必須在代碼的其餘部分中更改伺服器的名稱。

// Create a new servo object:
Servo myservo;
之後,定義了伺服電機連接到哪個 Arduino 引腳。

// Define the servo pin:
#define servoPin 9

該語句用於爲常量值命名。編譯器將在編譯程序時將用定義的值替換對此常量的任何引用。所以在你提到的任何地方,編譯器都會在編譯程序時用值 9 替換它。

#define
servoPin

該變量用於存儲伺服器的當前位置(以度爲單位)。
angle

// Create a variable to store the servo position:
int angle = 0;

在代碼的設置部分,我們將創建的伺服對象鏈接到將控制舵機的引腳。該函數還具有兩個可選參數,

attach()

void setup() {
// Attach the Servo variable to a pin:
myservo.attach(servoPin);
}

控制角度/位置:

在循環的第一部分中,我們只需告訴伺服電機使用該功能移動到特定角度。請注意,命令之間需要延遲,以便伺服電機有時間移動到設定位置。

write()

// Tell the servo to go to a particular angle:
myservo.write(90);
delay(1000);
myservo.write(180);
delay(1000);
myservo.write(0);
delay(1000);

控制速度:

在代碼的最後一部分,我使用了兩個[for循環]來回掃動伺服電機。如果要控制伺服電機的速度,這段代碼也很有用。通過更改 for 循環末尾的延遲值,可以調整伺服臂的速度。

// Sweep from 0 to 180 degrees:
for (angle = 0; angle <= 180; angle += 1) {
myservo.write(angle);
delay(15);
}
// And back from 180 to 0 degrees:
for (angle = 180; angle >= 0; angle -= 1) {
myservo.write(angle);
delay(30);
}

Arduino 伺服庫通過在函數中指定兩個可選參數,可以非常輕鬆地調整伺服電機的最小和最大角度。在此函數中,第一個參數是伺服器所連接的引腳編號。第二個參數是脈衝寬度,以微秒 (μs) 爲單位,對應於伺服電機的最小(0 度)角度。第三個參數是脈衝寬度,以微秒爲單位,對應於伺服電機的最大(180 度)角度。

attach()

默認情況下,最小和最大脈衝寬度設置爲 544 和 2400 微秒。這些值適用於最常見的舵機,但有時您必須稍微調整這些值。

我建議以小增量(10-20微秒)調整最小值和最大值,以避免損壞伺服器。如果伺服臂達到電機的物理極限,請增加最小值,並減小最大值。

#define servoPin 9
int min = 480;
int max = 2500;
Servo myservo;

void setup() {
myservo.attach(servoPin, min, max);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章