本文將繼續(xù)圍繞舵機(jī)的控制進(jìn)行,我們將以Tower Pro (輝盛)SG90舵機(jī)的控制為例,因?yàn)镾G90是市面上價(jià)格較便宜,也是實(shí)驗(yàn)中用得最多的產(chǎn)品之一。
舵機(jī)
舵機(jī)(servo motor),常用于遙控模型飛機(jī),所以又常稱為RC伺服電機(jī)(RC Servo,Radio Control Servo,Remote Control Servo)。詳見:什么是舵機(jī)?
舵機(jī)里含有直流馬達(dá)、齒輪箱、軸柄、以及控制電路,我們可透過信號(hào)控制軸柄的轉(zhuǎn)動(dòng)角度,大概都是0到180度,但不同廠牌型號(hào)會(huì)有不同的范圍;經(jīng)由齒輪箱降速后,變成適當(dāng)可用的轉(zhuǎn)速,并且提供更高的轉(zhuǎn)矩(扭力)。詳見:舵機(jī)的工作原理
不過每個(gè)廠牌型號(hào)的舵機(jī)可允許旋轉(zhuǎn)的角度各不相同,也就是說可接受的信號(hào)脈沖范圍也不相同,必須查閱產(chǎn)品資料規(guī)格書,若超出范圍可能會(huì)損害舵機(jī)。下面是Tower Pro SG90的規(guī)格:
重量:9g
尺寸:23*12.2*29mm
工作電壓:4.8V轉(zhuǎn)矩:1.8kg-cm,當(dāng)工作電壓為4.8V時(shí)
運(yùn)轉(zhuǎn)速度:0.1秒 ∕ 60度 ,當(dāng)工作電壓為4.8V時(shí)
脈沖寬度范圍:500~2400µs
死頻帶寬度(dead band width):10µs
從中我們可知,可允許的脈沖范圍是500~2400µs,也就是0.5~2.4ms,比剛剛說的一般范圍還要寬,也就代表這個(gè)舵機(jī)能旋轉(zhuǎn)的角度更大。另外有項(xiàng)值得一提的數(shù)據(jù)是死頻帶寬度,意思是說,因?yàn)樾盘?hào)可能不穩(wěn)定而上下起伏,當(dāng)這一次脈沖寬度與上一次相差不超過死頻帶寬度時(shí),舵機(jī)便不會(huì)動(dòng)作。
servo.h控制舵機(jī)
本次試驗(yàn),我們直接用Arduino的5V腳為舵機(jī)供電。若使用超過兩個(gè)舵機(jī),則應(yīng)該使用獨(dú)立的電源為舵機(jī)供電,記得共地。信號(hào)腳使用Arduino的D9。 Arduino內(nèi)建操控舵機(jī)的標(biāo)準(zhǔn)庫,使用方法非常簡單。在如何使用Arduino舵機(jī)庫servo.h一文中,我們也進(jìn)行了相關(guān)函數(shù)的介紹。下面以操控舵機(jī)的旋轉(zhuǎn)角度為例,來看看servo.h如何控制舵機(jī)。本實(shí)驗(yàn)使用此servo.h代碼庫時(shí),D9與D10無法輸出PWM信號(hào),于是我們將舵機(jī)的信號(hào)線接在數(shù)位腳位9或10。 代碼如下:
#include <Servo.h> Servo myservo; // 建立Servo實(shí)例,控制舵機(jī) void setup() { myservo.attach(9); // 連接D9,舵機(jī)的信號(hào)線 } void loop() { for(int i = 0; i <= 180; i+=1){ myservo.write(i); // 使用write,傳入角度值,從0度轉(zhuǎn)到180度 delay(20); } for(int i = 180; i >= 0; i-=1){ myservo.write(i);// 使用write,傳入角度值,從180度轉(zhuǎn)到0度 delay(20); } }
不過Servo.h預(yù)設(shè)的脈沖寬度范圍是544到2400µs,跟SG90舵機(jī)的500到2400差了一些些,我們可修正此點(diǎn)。
#include <Servo.h> Servo myservo; void setup() { myservo.attach(9, 500, 2400); // 修正脈沖寬度范圍 myservo.write(90); // 開始先置中90度 delay(3000); } void loop() { for(int i = 500; i <= 2400; i+=100){ myservo.writeMicroseconds(i); // 直接以脈沖寬度控制 delay(300); } for(int i = 2400; i >= 500; i-=100){ myservo.writeMicroseconds(i); delay(300); } }
這里需要注意的,使用舵機(jī)前必須查詢舵機(jī)的規(guī)格參數(shù)表,查到正確的脈沖寬度范圍,如果與servo.h的預(yù)設(shè)范圍有偏差,需要采用“myservo.attach(9, 500, 2400)”的方式進(jìn)行修正。使用writeMicroseconds函數(shù)時(shí)也要注意,不能傳入超出范圍的值,否則可能會(huì)損壞舵機(jī)。