37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑑於本人手頭積累了一些傳感器和執行器模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流爲目的,這裏準備逐一動手試試多做實驗,不管成功與否,都會記錄下來——小小的進步或是搞不掂的問題,希望能夠拋磚引玉。
【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗一百六十七:180度單軸舵機 MG996R伺服電機 13KG智能小車機器人機械手臂DIY雲臺配件
工作原理
舵機安裝了一個電位器(或其它角度傳感器)檢測輸出軸轉動角度,控制板根據電位器的信息能比較精確的控制和保持輸出軸的角度。這樣的直流電機控制方式叫閉環控制,所以舵機更準確的說是伺服馬達,英文 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);
}