舵機(jī)是一種位置伺服的驅(qū)動(dòng)器,主要是由外殼代嗤、電路板、無(wú)核心馬達(dá)缠借、齒輪與位置檢測(cè)器所構(gòu)成干毅。一種位置(角度)伺服的驅(qū)動(dòng)器,適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)泼返。目前在高檔遙控玩具硝逢,如航模,包括飛機(jī)模型,潛艇模型渠鸽;遙控機(jī)器人中已經(jīng)使用得比較普遍叫乌。舵機(jī)是一種俗稱,其實(shí)是一種伺服馬達(dá)徽缚。
1. 舵機(jī)的工作原理:
原理是由接收機(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 度呻引。
2. 舵機(jī)的電線介紹:
舵機(jī)有很多規(guī)格礼仗,但所有的舵機(jī)都有外接三根線,分別用棕逻悠、紅元践、橙三種顏色進(jìn)行區(qū)分,由于舵機(jī)品牌不同童谒,顏色也會(huì)有所差異单旁,棕色為接地線,紅色為電源正極線饥伊,橙色為信號(hào)線象浑。
舵機(jī)線 | 棕色 | 紅色 | 橙色 |
---|---|---|---|
功能 | 接地 | 正極 | 信號(hào)線 |
3. 舵機(jī)的控制:
舵機(jī)的轉(zhuǎn)動(dòng)的角度是通過(guò)調(diào)節(jié)PWM(脈沖寬度調(diào)制)信號(hào)的占空比來(lái)實(shí)現(xiàn)的,標(biāo)準(zhǔn)PWM(脈沖寬度調(diào)制)信號(hào)的周期固定為20ms(50Hz)撵渡,理論上脈寬分布應(yīng)在1ms
到2ms
之間融柬,但是,事實(shí)上脈寬可由0.5ms
到2.5ms
之間趋距,脈寬和舵機(jī)的轉(zhuǎn)角0°~180°相對(duì)應(yīng)粒氧。
旋轉(zhuǎn)的角度數(shù)對(duì)應(yīng)著相應(yīng)的脈沖的寬度。
舵機(jī)的控制方式有兩種:
- 通過(guò)Arduino 的普通數(shù)字傳感器接口產(chǎn)生占空比不同的方波节腐,模擬產(chǎn)生PWM 信號(hào)進(jìn)行舵機(jī)定位外盯;
- 直接利用Arduino 自帶的Servo 函數(shù)進(jìn)行舵機(jī)的控制摘盆,這種控制方法的優(yōu)點(diǎn)在于程序編寫(xiě),缺點(diǎn)是只能控制2 路舵機(jī)饱苟,
注意:
由于舵機(jī)牌子不同孩擂,對(duì)于同一信號(hào),不同牌子的舵機(jī)旋轉(zhuǎn)的角度也會(huì)有所不同箱熬。
4. 例程:
-
舵機(jī)轉(zhuǎn)動(dòng)
#include <Servo.h> //此程序的功能是將舵機(jī)從0到180度然后從180到0度不停的旋轉(zhuǎn)
Servo myservo; //創(chuàng)建一個(gè)舵機(jī)控制對(duì)象
// 使用Servo類最多可以控制8個(gè)舵機(jī)
int pos = 0; // 該變量用與存儲(chǔ)舵機(jī)角度位置
void setup()
{
myservo.attach(9); // 該舵機(jī)由arduino第九腳控制
}
void loop()
{
for(pos = 0; pos < 180; pos += 1) // 從0度到180度運(yùn)動(dòng)
{ // 每次步進(jìn)一度
myservo.write(pos); // 指定舵機(jī)轉(zhuǎn)向的角度
delay(15); // 等待15ms讓舵機(jī)到達(dá)指定位置
}
for(pos = 180; pos>=1; pos-=1) //從180度到0度運(yùn)動(dòng)
{
myservo.write(pos); // 指定舵機(jī)轉(zhuǎn)向的角度
delay(15); // 等待15ms讓舵機(jī)到達(dá)指定位置
}
}
-
電位計(jì)控制舵機(jī)
#include <Servo.h> //此程序是用電位計(jì)來(lái)控制舵機(jī)的旋轉(zhuǎn)的类垦。
Servo myservo; //創(chuàng)建一個(gè)舵機(jī)控制對(duì)象
int potpin = 0; //該變量用于存儲(chǔ)用電位器讀出的模擬值
int val; // 該變量用與存儲(chǔ)舵機(jī)角度位置
void setup()
{
myservo.attach(9); // 該舵機(jī)由arduino第九腳控制
}
void loop()
{
val = analogRead(potpin); //讀取電位器控制的模擬值 (范圍在0-1023)
val = map(val, 0, 1023, 0, 179); // map函數(shù)是arduino自帶的
函數(shù),不是需要引用庫(kù)城须。意思是把0-1023與0-179縮小范圍對(duì)應(yīng)起來(lái) 蚤认;
myservo.write(val); // 指定舵機(jī)轉(zhuǎn)向的角度
delay(15); // 等待15ms讓舵機(jī)到達(dá)指定位置
}
-
串口通信控制舵機(jī)
int sp1=10;//定義舵機(jī)接口數(shù)字接口10
int pulsewidth;//定義脈寬變量
int val;
int val1;
int myangle1;
//下面是servopulse函數(shù)部分
void servopulse(int sp1,int val1)//定義一個(gè)脈沖函數(shù)
{
myangle1=map(val1,0,180,500,2480);
digitalWrite(sp1,HIGH);//將舵機(jī)接口電平至高
delayMicroseconds(myangle1);//延時(shí)脈寬值的微秒數(shù)
digitalWrite(sp1,LOW);//將舵機(jī)接口電平至低
delay(20-myangle1/1000); //原文是val1,不知道為什么也執(zhí)行正確
}
//servopulse函數(shù)部分到此結(jié)束
void setup()
{
pinMode(sp1,OUTPUT);//設(shè)定舵機(jī)接口為輸出接口
//設(shè)置兩組串口波特率
Serial.begin(9600);
delay(500);
Serial.println("servu=o_seral_simple ready" ) ;
}
void loop()//將0到9的數(shù)轉(zhuǎn)化為0到180角度糕伐,并讓LED閃爍相應(yīng)數(shù)的次數(shù)
{
val=Serial.read();//讀取串行端口的值
if(val>'0'&&val<='9')
{
val1=val-'0';//將特征量轉(zhuǎn)化為數(shù)值變量
val1=map(val1,0,9,0,180);//將角度轉(zhuǎn)化為500-2480的脈寬值
Serial.print("moving servo to ");
Serial.print(val1,DEC); //DEC是十進(jìn)制的意思砰琢。
Serial.println();
for(int i=0;i<=50;i++)//給予舵機(jī)足夠的時(shí)間讓它轉(zhuǎn)到指定角度
{
servopulse(sp1,val1);//引用脈沖函數(shù)
}
}
}
舵機(jī)的控制有些bug(奇怪),用非pwm的端口也能控制良瞧。
5. 舵機(jī)的實(shí)際應(yīng)用陪汽。
- 高檔遙控仿真車,至少得包括左轉(zhuǎn)和右轉(zhuǎn)功能,高精度的角度控制,必然給你最真實(shí)的駕車體驗(yàn).
- 多自由度機(jī)器人設(shè)計(jì),為什么日本人設(shè)計(jì)的機(jī)器人可以上萬(wàn)RMB的出售,而國(guó)內(nèi)設(shè)計(jì)的一些兩三千塊也賣不出去呢,還是一個(gè)品質(zhì)的問(wèn)題褥蚯。
- 多路伺服航闹吭控制,電動(dòng)遙控飛機(jī),油動(dòng)遙控飛機(jī),航海模型等。