37款傳感器與模塊的提法,在網(wǎng)絡(luò)上廣泛流傳悍抑,其實(shí)Arduino能夠兼容的傳感器模塊肯定是不止37種的鳄炉。鑒于本人手頭積累了一些傳感器和執(zhí)行器模塊,依照實(shí)踐出真知(一定要?jiǎng)邮肿觯┑睦砟钏崖猓詫W(xué)習(xí)和交流為目的拂盯,這里準(zhǔn)備逐一動(dòng)手試試多做實(shí)驗(yàn),不管成功與否记靡,都會(huì)記錄下來(lái)——小小的進(jìn)步或是搞不掂的問(wèn)題谈竿,希望能夠拋磚引玉。
【Arduino】168種傳感器模塊系列實(shí)驗(yàn)(資料代碼+仿真編程+圖形編程)
實(shí)驗(yàn)一百六十七:180度單軸舵機(jī) MG996R伺服電機(jī) 13KG智能小車(chē)機(jī)器人機(jī)械手臂DIY云臺(tái)配件
知識(shí)點(diǎn):舵機(jī)是什么摸吠?
伺服電機(jī)通常被稱(chēng)為舵機(jī)空凸,它是一種帶有輸出軸的小裝置。當(dāng)我們向伺服器發(fā)送一個(gè)控制信號(hào)時(shí)寸痢,輸出軸就可以轉(zhuǎn)到特定的位置呀洲。只要控制信號(hào)持續(xù)不變,伺服機(jī)構(gòu)就會(huì)保持軸的角度位置不改變啼止。如果控制信號(hào)發(fā)生變化道逗,輸出軸的位置也會(huì)相應(yīng)發(fā)生變化。
舵機(jī)是一種位置伺服的驅(qū)動(dòng)器献烦,主要是由外殼滓窍、電路板、無(wú)核心馬達(dá)巩那、齒輪與位置檢測(cè)器所構(gòu)成吏夯。其工作原理是由接收機(jī)或者單片機(jī)發(fā)出信號(hào)給舵機(jī),其內(nèi)部有一個(gè)基準(zhǔn)電路拢操,產(chǎn)生周期為20ms锦亦,寬度為1.5ms 的基準(zhǔn)信號(hào),將獲得的直流偏置電壓與電位器的電壓比較令境,獲得電壓差輸出杠园。經(jīng)由電路板上的IC 判斷轉(zhuǎn)動(dòng)方向,再驅(qū)動(dòng)無(wú)核心馬達(dá)開(kāi)始轉(zhuǎn)動(dòng)舔庶,透過(guò)減速齒輪將動(dòng)力傳至擺臂抛蚁,同時(shí)由位置檢測(cè)器送回信號(hào),判斷是否已經(jīng)到達(dá)定位惕橙。適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)瞧甩。當(dāng)電機(jī)轉(zhuǎn)速一定時(shí),通過(guò)級(jí)聯(lián)減速齒輪帶動(dòng)電位器旋轉(zhuǎn)弥鹦,使得電壓差為0肚逸,電機(jī)停止轉(zhuǎn)動(dòng)爷辙。一般舵機(jī)旋轉(zhuǎn)的角度范圍是0 度到180 度。
日常生活中朦促,舵機(jī)常被用于遙控飛機(jī)膝晾、遙控汽車(chē)、機(jī)器人等領(lǐng)域务冕。舵機(jī)在機(jī)器人領(lǐng)域非常有用血当。因?yàn)槎鏅C(jī)有內(nèi)置的控制電路,它們的尺寸雖然很小禀忆,但輸出力夠大臊旭。像Futaba S-148這樣的標(biāo)準(zhǔn)舵機(jī)能提供 0.3牛/米的扭矩,相對(duì)于它的外形大小來(lái)說(shuō)這已經(jīng)足夠強(qiáng)大了箩退。同時(shí)离熏,舵機(jī)消耗的能量與機(jī)械負(fù)荷成正比。因此乏德,一個(gè)輕載的舵機(jī)系統(tǒng)不會(huì)消耗太多的能量撤奸。
工作原理
舵機(jī)安裝了一個(gè)電位器(或其它角度傳感器)檢測(cè)輸出軸轉(zhuǎn)動(dòng)角度,控制板根據(jù)電位器的信息能比較精確的控制和保持輸出軸的角度喊括。這樣的直流電機(jī)控制方式叫閉環(huán)控制胧瓜,所以舵機(jī)更準(zhǔn)確的說(shuō)是伺服馬達(dá),英文 servo.舵機(jī)組成: 舵盤(pán)郑什、 減速齒輪府喳、 位置反饋電位計(jì)跨琳、直流電機(jī)箕宙、 控制電路板等务甥÷羊龋控制電路板接受來(lái)自信號(hào)線的控制信號(hào),控制電機(jī)轉(zhuǎn)動(dòng)髓介,電機(jī)帶動(dòng)一系列齒輪組榕暇,減速后傳動(dòng)至輸出舵盤(pán)蛆封。舵機(jī)的輸出軸和位置反饋電位計(jì)是相連的剃法,舵盤(pán) 轉(zhuǎn)動(dòng)的同時(shí)碎捺,帶動(dòng)位置反饋電位計(jì),電位計(jì)將輸出一個(gè)電壓信號(hào)到控制電路板贷洲,進(jìn)行反饋收厨,然后控制電路板根據(jù)所在位置決定電機(jī)轉(zhuǎn)動(dòng)的方向和速度,從而達(dá)到目標(biāo)停止优构。其工作流程為:控制信號(hào)→控制電路板→電機(jī)轉(zhuǎn)動(dòng)→齒輪組減速→舵盤(pán)轉(zhuǎn)動(dòng)→位置反饋電位計(jì)→控制電路板反饋诵叁。
機(jī)的閉環(huán)檢測(cè)機(jī)制
關(guān)于舵機(jī)的精準(zhǔn)位置控制,存在以下如下圖的閉環(huán)控制機(jī)制钦椭。即:位置檢測(cè)器(角度傳感器)是它的輸入傳感器拧额,舵機(jī)轉(zhuǎn)動(dòng)的位置變化碑诉,位置檢測(cè)器的電阻值就會(huì)跟著變化。通過(guò)控制電路讀取該電阻值的大小势腮,就能根據(jù)阻值適當(dāng)調(diào)整電機(jī)的速度和方向联贩,使電機(jī)向指定角度旋轉(zhuǎn)漫仆。從而實(shí)現(xiàn)了舵機(jī)的精確轉(zhuǎn)動(dòng)的控制捎拯。
舵機(jī)的控制信號(hào)
為周期是20ms的脈寬調(diào)制(PWM)信號(hào),其中脈沖寬度從0.5ms-2.5ms盲厌,相對(duì)應(yīng)舵盤(pán)的位置為0-180度署照,呈線性變化。也就是說(shuō)吗浩,給它提供一定的脈寬建芙,它的輸出軸就會(huì)保持在一個(gè)相對(duì)應(yīng)的角度上,無(wú)論外界轉(zhuǎn)矩怎樣改變懂扼,直到給它提供一個(gè)另外寬度的脈沖信號(hào)禁荸,它才會(huì)改變輸出角度到新的對(duì)應(yīng)的位置上。舵機(jī)內(nèi)部有一個(gè)基準(zhǔn)電路阀湿,產(chǎn)生周期20ms赶熟,寬度1.5ms的基準(zhǔn)信號(hào),有一個(gè)比較器陷嘴,將外加信號(hào)與基準(zhǔn)信號(hào)相比較映砖,判斷出方向和大小,從而產(chǎn)生電機(jī)的轉(zhuǎn)動(dòng)信號(hào)灾挨。由此可見(jiàn)邑退,舵機(jī)是一種位置伺服的驅(qū)動(dòng)器,轉(zhuǎn)動(dòng)范圍不能超過(guò)180度劳澄,適用于那些需要角度不斷變化并可以保持的驅(qū)動(dòng)當(dāng)中地技。比方說(shuō)機(jī)器人的關(guān)節(jié)、飛機(jī)的舵面等秒拔。
Arduino實(shí)驗(yàn)接線示意圖
【Arduino】168種傳感器模塊系列實(shí)驗(yàn)(資料代碼+仿真編程+圖形編程)
實(shí)驗(yàn)一百六十七:180度單軸舵機(jī) MG996R伺服電機(jī) 13KG智能小車(chē)機(jī)器人機(jī)械手臂DIY云臺(tái)配件
項(xiàng)目:簡(jiǎn)單控制舵機(jī)MG966R
Arduino實(shí)驗(yàn)開(kāi)源代碼
/*
【Arduino】168種傳感器模塊系列實(shí)驗(yàn)(資料代碼+仿真編程+圖形編程)
項(xiàng)目:簡(jiǎn)單控制舵機(jī)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實(shí)驗(yàn)場(chǎng)景圖
代碼的工作原理
第一步是包含所需的Arduino庫(kù)莫矗。您還可以在“文件>示例>Servo”下找到此庫(kù)。
// Include the servo library:
include <Servo.h>
接下來(lái)溯警,您需要?jiǎng)?chuàng)建 Servo 類(lèi)的新對(duì)象趣苏。在這種情況下,稱(chēng)舵機(jī)為“myservo”梯轻,但您也可以使用其他名稱(chēng)食磕。請(qǐng)注意,您還必須在代碼的其余部分中更改伺服器的名稱(chēng)喳挑。
// Create a new servo object:
Servo myservo;
之后彬伦,定義了伺服電機(jī)連接到哪個(gè) Arduino 引腳滔悉。
// Define the servo pin:
define servoPin 9
該語(yǔ)句用于為常量值命名。編譯器將在編譯程序時(shí)將用定義的值替換對(duì)此常量的任何引用单绑。所以在你提到的任何地方回官,編譯器都會(huì)在編譯程序時(shí)用值 9 替換它。
define
servoPin
該變量用于存儲(chǔ)伺服器的當(dāng)前位置(以度為單位)搂橙。
angle
// Create a variable to store the servo position:
int angle = 0;
在代碼的設(shè)置部分歉提,我們將創(chuàng)建的伺服對(duì)象鏈接到將控制舵機(jī)的引腳。該函數(shù)還具有兩個(gè)可選參數(shù)区转,
attach()
void setup() {
// Attach the Servo variable to a pin:
myservo.attach(servoPin);
}
控制角度/位置:
在循環(huán)的第一部分中苔巨,我們只需告訴伺服電機(jī)使用該功能移動(dòng)到特定角度废离。請(qǐng)注意,命令之間需要延遲蜻韭,以便伺服電機(jī)有時(shí)間移動(dòng)到設(shè)定位置。
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);
控制速度:
在代碼的最后一部分肖方,我使用了兩個(gè)[for循環(huán)]來(lái)回掃動(dòng)伺服電機(jī)闺魏。如果要控制伺服電機(jī)的速度窥妇,這段代碼也很有用舷胜。通過(guò)更改 for 循環(huán)末尾的延遲值活翩,可以調(diào)整伺服臂的速度烹骨。
// 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 伺服庫(kù)通過(guò)在函數(shù)中指定兩個(gè)可選參數(shù),可以非常輕松地調(diào)整伺服電機(jī)的最小和最大角度材泄。在此函數(shù)中,第一個(gè)參數(shù)是伺服器所連接的引腳編號(hào)拉宗。第二個(gè)參數(shù)是脈沖寬度,以微秒 (μs) 為單位魁巩,對(duì)應(yīng)于伺服電機(jī)的最薪愀 (0 度)角度。第三個(gè)參數(shù)是脈沖寬度卖鲤,以微秒為單位畴嘶,對(duì)應(yīng)于伺服電機(jī)的最大(180 度)角度集晚。
attach()
默認(rèn)情況下,最小和最大脈沖寬度設(shè)置為 544 和 2400 微秒偷拔。這些值適用于最常見(jiàn)的舵機(jī),但有時(shí)您必須稍微調(diào)整這些值悦污。
我建議以小增量(10-20微秒)調(diào)整最小值和最大值钉蒲,以避免損壞伺服器彻坛。如果伺服臂達(dá)到電機(jī)的物理極限,請(qǐng)?jiān)黾幼钚≈挡耄p小最大值。
define servoPin 9
int min = 480;
int max = 2500;
Servo myservo;
void setup() {
myservo.attach(servoPin, min, max);
}