一、舵機的基本原理
舵機是一種能夠通過控制電子信號來控制機器人或其他機械的角度和角速度的電機。舵機電路核心由一個電機、一組位置傳感器和一個控制電路組成。這個組合使得舵機變得非常精確。舵機的控制信號是通過PWM(脈寬調製)來控制的, 即通過改變脈衝寬度的長度。而PWM的周期則由控制電路中的晶振來控制。
當接收到指令後,控制電路會將信號傳送給電機。電機會進行轉動,並且反饋給不斷變化的電壓值。位置傳感器感受到這個變化並且傳遞給控制電路。控制電路會將傳感器的反饋和目標脈衝信號進行比較處理,確保電機轉動到目標角度並且停止。
下面是一個典型的舵機的原理圖:
----------------------------- | | MOTOR | | | | | | | V | | | [M1] | | | A | | | | | | | V | | | |-[POT1]-| | | |----|Signal | | | | |-[POT2]-| | | | | +----+-- OUT <------ Control Signal | | | | -----------------------------
舵機的電路圖非常簡單。首先,舵機需要一個電源來控制電機和控制電路。電機由M1代表,它以正向電流來轉動或者以反向電流來迴轉。我們並不需要知道電機是如何驅動的,但是我們需要知道電機轉動的時候,我們需要使用位置反饋(POT1和POT2)來檢測位置變化。信號輸出的地方由OUT標識
二、如何控制舵機
控制舵機需要幾個關鍵因素。第一個是PWM頻率。第二個是占空比,也就是脈衝的寬度。最後,還需考慮單個特定舵機的最小響應時間。
對於各種舵機,都有一個標準的PWM頻率。雖然有關5Hz至400Hz的頻率都可以被接受,但是實際上,500Hz被視為最適宜的PWM頻率。實際上,使用PWM頻率太低會降低舵機的響應速度,而使用PWM太高也有些浪費。所以使用500Hz非常合適。
控制舵機的第二個關鍵因素是脈衝的寬度。這通常在0.5ms至2.5ms之間變化,但是這取決於特定的舵機。故而,控制端(PIN)需要發送一個PWM脈衝,其寬度表示一段特定的角度。例如:1.5ms的脈衝寬度對應着舵機的中心位置。如果你要讓舵機轉動至最大寬度,它需要被帶到其最大值。在達到最大值時,要停止發送脈衝來防止毀壞電機。
名義上,這個脈衝可以變化或者縮短至任何值。但是,為了簡單起見,我們通常將舵機控制脈衝的寬度設置在900-2100微秒(μs)之間。
三、如何控制SG90舵機
現在我們已經了解了舵機的原理和如何控制它。讓我們來看看如何控制一種具體的舵機。
SG90是一種非常受歡迎的舵機,因為它具有良好的響應速度和較低的功耗,同時價格便宜。在此處,我們將通過Arduino Uno控制此舵機。
在此之前,你需要無損地連接你的設備,如下圖所示:
_____________________ | GND VCC | |---. .----| PWM <---- Arduino Uno board | | | | | '-[ Servo ]-' | | | '-------------------'
接下來,讓我們來看看如何驅動這個舵機。我們需要簡單的代碼進行控制。我們可以使用內置的 Servo 庫來初始化和控制舵機。
#include Servo myServo; void setup() { // 初始化舵機對象 myServo.attach(9); } void loop() { // 轉動舵機至角度0 myServo.write(0); delay(1000); // 轉動舵機至角度90 myServo.write(90); delay(1000); // 轉動舵機至角度180 myServo.write(180); delay(1000); }
在這個示例程序中,我們在頻道9上初始化了 myServo 對象。然後,我們在自定義函數中使用 write() 函數來轉動舵機。在每個轉動過程中,我們會停留1秒鐘,然後再繼續。
四、如何控制MG996R舵機
與SG90類似,MG996R也是一種廣泛使用的舵機。在此之前,你還需連接你的設備,如下圖所示:
_____________________ | GND VCC | |---. .----| PWM <---- Arduino Uno board | | | | | '-[ Servo ]-' | | | '-------------------'
我們還是要使用 Servo 庫來初始化和控制舵機。不同之處在於其頻率是50 Hz,輸入電壓為6V-7.2V,並且它需要更長的占空比,通常在1000us至2000us之間變化。下面是該舵機的 Arduino 代碼:
#include Servo myServo; void setup() { // 初始化舵機對象 myServo.attach(9); } void loop() { // 轉動舵機至角度0 myServo.writeMicroseconds(1000); delay(1000); // 轉動舵機至角度90 myServo.writeMicroseconds(1500); delay(1000); // 轉動舵機至角度180 myServo.writeMicroseconds(2000); delay(1000); }
在這個示例程序中,我們使用了 writeMicroseconds() 函數,因為 MG996R 舵機的占空比在1000us至2000us之間變化。使用此函數,我們可以精確地控制占空比和舵機轉動的位置。
五、小結
通過以上分析,我們可以了解舵機的原理和如何控制它,包括SG90和 MG996R。使用 Servo 庫,我們可以方便地初始化和控制舵機。如有更複雜的任務和應用,請根據需要進行進一步定製和優化。
原創文章,作者:JLKU,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/136038.html