舵機(jī)是什么?
伺服電機(jī)通常被稱為舵機(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ī)常被用于遙控飛機(jī)、遙控汽車、機(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ī)的內(nèi)部結(jié)構(gòu)
舵機(jī)的內(nèi)部結(jié)構(gòu)如上圖所示。你可以看到控制電路,馬達(dá),一組齒輪和外殼。
當(dāng)然還包括電源線(+5V,紅色),地線(GND黑色)和PWM控制線(黃色或白色)。
舵機(jī)的工作原理
舵機(jī)內(nèi)部的控制電路,電位計(jì)(可變電阻器)和電機(jī)均被連接到電路板上,如內(nèi)部結(jié)構(gòu)圖的右邊部分。控制電路通過(guò)電位計(jì)可監(jiān)控舵機(jī)的當(dāng)前角度。
如果軸的位置與控制信號(hào)相符,那么電機(jī)就會(huì)關(guān)閉。如果控制電路發(fā)現(xiàn)這個(gè)角度不正確,它就會(huì)控制馬達(dá)轉(zhuǎn)動(dòng),直到它達(dá)到指定的角度。舵機(jī)角度根據(jù)制造商的不同而有所不同。比如,一個(gè)180度的舵機(jī),它可以在0度至180度之間運(yùn)動(dòng)。由于限位裝置被安裝在主輸出裝置上,超出這個(gè)范圍機(jī)械結(jié)構(gòu)就不能再轉(zhuǎn)動(dòng)了。
舵機(jī)的輸出功率與它所需要轉(zhuǎn)動(dòng)的距離成正比。如果輸出軸需要轉(zhuǎn)動(dòng)很長(zhǎng)的距離,馬達(dá)就會(huì)全速運(yùn)轉(zhuǎn),如果它只需要短距離轉(zhuǎn)動(dòng),馬達(dá)就會(huì)以較慢的速度運(yùn)行,這叫做速度比例控制。
如何讓舵機(jī)轉(zhuǎn)到指定角度?
控制線用于傳輸角度控制信號(hào)。這個(gè)角度是由控制信號(hào)脈沖的持續(xù)時(shí)間決定的,這叫做脈沖編碼調(diào)制(PCM)。舵機(jī)的控制一般需要一個(gè)20ms左右的時(shí)基脈沖,該脈沖的高電平部分一般為0.5ms-2.5ms范圍,總間隔為2ms。脈沖的寬度將決定馬達(dá)轉(zhuǎn)動(dòng)的距離。例如:1.5毫秒的脈沖,電機(jī)將轉(zhuǎn)向90度的位置(通常稱為中立位置,對(duì)于180°舵機(jī)來(lái)說(shuō),就是90°位置)。如果脈沖寬度小于1.5毫秒,那么電機(jī)軸向朝向0度方向。如果脈沖寬度大于1.5毫秒,軸向就朝向180度方向。以180度舵機(jī)為例,對(duì)應(yīng)的控制關(guān)系是這樣的:
0.5ms————-0度;
1.0ms————45度;
1.5ms————90度;
2.0ms———–135度;
2.5ms———–180度;
用Arduino UNO 控制舵機(jī)
測(cè)試的硬件條件:
• 1 × Arduino UNO.
• 1 × 舵機(jī).
• 1 × ULN2003 驅(qū)動(dòng)IC(用于防止直接通過(guò)Arduino驅(qū)動(dòng)舵機(jī)造成問(wèn)題.)
• 1 × 10 KΩ 電阻.
按照下圖所示進(jìn)行連接,如圖所示:
打開Arduino IDE,新建一個(gè)文件。
/* 使用可變電位計(jì)控制舵機(jī)轉(zhuǎn)動(dòng) */ #include Servo myservo; // 創(chuàng)建一個(gè) servo object int potpin = 0; // analog pin 用來(lái)連接電位計(jì) int val; // val存儲(chǔ)analog pin的值 void setup() { myservo.attach(9); // 連接舵機(jī)控制信號(hào)(黃或白)至 pin 9 } void loop() { val = analogRead(potpin); // 讀出可變電位計(jì)的值 (范圍 0 - 1023) val = map(val, 0, 1023, 0, 180); // 按舵機(jī)角度進(jìn)行設(shè)置 (范圍 0 - 180) myservo.write(val); //根據(jù)val值設(shè)置舵機(jī)位置 delay(15); }
連線注意:舵機(jī)有三個(gè)引腳(電源、GND和信號(hào))。電源線通常是紅色的,應(yīng)該連接到Arduino控制板上的5V針腳;GND地線通常是黑色或棕色的,應(yīng)該連接到ULN2003 IC上10-16針的任意一個(gè);信號(hào)線通常是黃色或白色的,應(yīng)該連接到Arduino 9號(hào)引腳。
可變電位計(jì)
可變電位計(jì)是一個(gè)分壓器,它可以根據(jù)可變電阻的值來(lái)調(diào)整電路的輸出電壓,電阻是通過(guò)旋鈕來(lái)控制的。它有三個(gè)引腳:GND,信號(hào), +5 V,如下圖所示
以上工作就緒并上傳代碼后,正常情況下當(dāng)我們旋轉(zhuǎn)可變電位計(jì),舵機(jī)將對(duì)應(yīng)改變其角度位置。