Raspberry Pi Pico MicroPython ile Servo Motor Kontrolü

Güncelleme tarihi: 9 Şub

Servo motorlar; çıkış, mekaniksel konumlar, hız veya ivme gibi parametrelerin de kontrol edildiği ve hareket kontrolü yapılan bir çeşit düzenektir. Servo motorun miline bağlı olan bir enkoder vardır. Bu enkoder servo motorun dönüş yönü, hızı ile dönüş açısını sürekli kontrol edebilmek için servo sürücüsüne sinyal göndermektedir. Ardından, sürücüye gelen sinyallere göre de; servo motora komut verir. Geri besleme sinyali ile de kontrol edilir.



Bu uygulamamızda servo motorun PWM ile çalışmasını inceleyeceğiz. Kullanacağımız malzemeler:

  • Servo Motor

  • Raspberry Pi Pico

  • Jumper Kablolar

  • Breadboard

Devre şeması aşağıdaki kurulmaktadır.


Artık kodlama kısmına geçebiliriz. PWM’in periyodu 20ms(50Hz)dir. Bu yüzden frekansımızı 50 Hz olarak belirtiyoruz.

servomotor.freq(50)

Normal bir servo motor, 0 ile 180 derece arasındaki açısal hareketleri kontrol etmektedir. Fonksiyon oluşturarak İf yapısı içerisinde derece ayarlarını kodluyoruz.



def yeniMotor(derece):
       if derece > 180:
           derece=180
       if derece < 0:
           derece=0

PWM’in görev döngüsü 65535 idi. Ancak servo motorun görev döngüsü 1000 ve 9000 arasındadır. Bu detayı kodlayarak devam ediyoruz.


maxDutyCycle = 9000
minDutyCycle = 1000

Motorun derecesine göre görev döngüsü değişkenlik gösterecektir. Bu yüzden bir formül tanımlıyoruz.

yeniDutyCycle=minDutyCycle+(maxDutyCycle-minDutyCycle)*(derece/180)

Kodun tamamı aşağıda verilmiştir.


from machine import Pin, PWM
import time

servomotor = PWM(Pin(15))
servomotor.freq(50)


def yeniMotor(derece):
     if derece > 180:
        derece=180
     if derece < 0:
        derece=0

     maxDutyCycle = 9000
     minDutyCycle = 1000

     yeniDutyCycle=minDutyCycle+(maxDutyCycle-minDutyCycle)*(derece/180)

      servomotor.duty_u16(int(yeniDutyCycle))

while True:
        for derece in range(0,180,1):
           yeniMotor(derece)
           time.sleep(0.1)
           print("Derece: "+str(derece))
         for derece in range(180,0,-1):
           yeniMotor(derece)
           time.sleep(0.1)
           print("Derece: "+str(derece))




Son Paylaşımlar