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

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

【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗一百六十九:360° MG996R舵機/機器人/機械臂/航模/車模 55克模型大扭力金屬齒輪

 

知識點:舵機是什麼?
伺服電機通常被稱爲舵機,它是一種帶有輸出軸的小裝置。當我們向伺服器發送一個控制信號時,輸出軸就可以轉到特定的位置。只要控制信號持續不變,伺服機構就會保持軸的角度位置不改變。如果控制信號發生變化,輸出軸的位置也會相應發生變化。

舵機是一種位置伺服的驅動器,主要是由外殼、電路板、無核心馬達、齒輪與位置檢測器所構成。其工作原理是由接收機或者單片機發出信號給舵機,其內部有一個基準電路,產生週期爲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種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗一百六十九:360° MG996R舵機/機器人/機械臂/航模/車模 55克模型大扭力金屬齒輪
項目:快速正向轉動3秒,停止1秒,慢速反向轉動3秒
Arduino參考開源代碼

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

  項目:快速正向轉動3秒,停止1秒,慢速反向轉動3秒
*/

#include <Servo.h>
Servo myservo;

void setup() {
  myservo.attach(9);
}

void loop() {
  myservo.write(50);   //設定一個正轉速度(由快到慢0-89)
  delay(3000);         //它會在這3秒內一直轉動
  myservo.write(90);   //發送停止命令
  delay(1000);         //等待一會
  myservo.write(180);  //設定一個反轉速度(由慢到快91-180)
  delay(3000);         //它會在這3秒內一直轉動
  myservo.write(90);   //發送停止命令
  delay(1000);         // 等待一會
}

  

Arduino實驗場景圖

 

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