伺服馬達(舵機)

舵機是一種可透過 PWM 訊號來控制馬達旋轉角度的裝置,型號有很多種,其中 TowerPro SG90 是最常見的型號而且也很便宜,雖然乘載太重的東西可能會轉不動,但一般小東西沒問題。SG90 有兩種規格,一種只能轉 180 度,另一種可以 360 度一直旋轉,想要控制旋轉角度的要選前一種。

Sg90-9g-Micro-Servo-Motor-Tower-PRO

這個裝置上有三條線,紅色線接 5V,黑色或棕色線接 GND,橘色線接可輸出 PWM 訊號的接腳(Pico 任何一個 GPIO 都可以輸出 PWM)。根據規格書,SG90 在 0 到 180 度需要的脈衝寬度為 500 μs 到 2400 μs,因此若 PWM 設定頻率 50Hz 時,0 度的佔空比為 2.5%,180 度的佔空比為 12%,計算方式如下:

  • 0 度:500 * 10-6 / (1 / 50) = 0.025
  • 180 度:2400 * 10-6 / (1 / 50) = 0.12

SG90 每 0.1 秒可以轉動 60 度,所以從 0 度轉到 180 度需要 0.3 秒,程式中必須充分給足轉動時間。根據上面這些結果,接下來設計一個函數來控制旋轉角度。

from utime import *

def rotate(servo, degree, delay=0.4):
    dc = (0.12 - 0.025) / 180 * degree + 0.025)
    servo.duty_u16(int(65535 * dc))
    sleep(delay)

硬體線路接法非常容易,如下。

picow_servo_bb

範例程式如下。執行後會先讓舵機轉到 0 度再轉到 180 度當作初始化動作,接著會從 180 度慢慢地轉到 0 度然後再慢慢地轉到 180 度。

from machine import *
from utime import *

def rotate(servo, degree, delay=0.4):
    dc = (0.12 - 0.025) / 180 * degree + 0.025
    servo.duty_u16(int(65535 * dc))
    sleep(delay)
    
def init(servo):
    rotate(servo, 0, 3)
    rotate(servo, 180)

def main():
    servo1 = PWM(Pin(2))
    servo1.freq(50)
    
    init(servo1)
    
    for i in range(180, -1, -1):
        rotate(servo1, i, 0.02)
    for i in range(181):
        rotate(servo1, i, 0.02)

    servo1.deinit()

main()

Library(mservo.py)

from machine import *
from utime import *

class Servo:
    def __init__(self, pin, reset=False):
        self.servo = PWM(Pin(pin))
        self.servo.freq(50)
        if reset:
            self.rotate(0)
        
    def rotate(self, degree, delay=0.4):
        self.degree = degree
        dc = (0.12 - 0.025) / 180 * degree + 0.025
        self.servo.duty_u16(int(65535 * dc))
        sleep(delay)
        
    def close(self):
        self.servo.deinit()

if __name__ == '__main__':
    servo = Servo(0, True)
    servo.rotate(75)
    servo.close()

★本系列收錄於「第一次就上手」選單

發表迴響