舵機是一種可透過 PWM 訊號來控制馬達旋轉角度的裝置,型號有很多種,其中 TowerPro SG90 是最常見的型號而且也很便宜,雖然乘載太重的東西可能會轉不動,但一般小東西沒問題。SG90 有兩種規格,一種只能轉 180 度,另一種可以 360 度一直旋轉,想要控制旋轉角度的要選前一種。
這個裝置上有三條線,紅色線接 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)
硬體線路接法非常容易,如下。
範例程式如下。執行後會先讓舵機轉到 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()
★本系列收錄於「第一次就上手」選單