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))
Comments