Raspberry Pi Pico PWM ve Servo Kullanımı

Raspberry Pi Pico MicroPython PWM ve Servo Kullanımı

Bu rehberimizde, MicroPython dilini kullanarak Pico PWM modülünü yapılandıracak ve popüler bir SG90 analog servo motoru 0 ile 180 derece arasında pürüzsüzce nasıl kontrol edeceğimizi, arkasındaki sinyal matematiği ve donanım bağlantılarıyla birlikte inceleyeceğiz. Gelişmiş donanım temellerini ve modülasyon kavramlarını pekiştirmek için hazırladığımız PWM Nedir? Darbe Genişliği Modülasyonu başlıklı yazımıza da göz atabilirsiniz.

Raspberry Pi Pico’nun en güçlü ve esnek donanım özelliklerinden biri, fiziksel dünyayı kontrol etmemizi sağlayan gelişmiş PWM (Pulse Width Modulation – Darbe Genişliği Modülasyonu) kanallarıdır.

Darbe Genişliği Modülasyonu (PWM) Çalışma Prensibi

PWM, dijital pinlerden (0 ve 1) üretilen yüksek frekanslı kare dalgaların “AÇIK” (ON – High) kalma süresinin (Duty Cycle – Görev Döngüsü) değiştirilerek analog bir voltaj çıkışı taklit edilmesi tekniğidir. Bu yöntem, yüke aktarılan ortalama gücü hassas bir şekilde kontrol etmemizi sağlar. Örneğin, bir pine %50 duty cycle uygulandığında, o pinden elde edilen ortalama voltaj, tam çıkış voltajının (3.3\text{V}) yarısı olan 1.65\text{V} seviyesinde olur.

PWM Sinyal Görev Döngüsü Duty Cycle
Farklı görev döngüsü (Duty Cycle) oranlarına sahip PWM kare dalga formları

Herhangi bir PWM dalgasının tam bir AÇIK ve KAPALI evresi Periyot (T) olarak adlandırılır. Bir saniyedeki periyot sayısı ise Frekans (F) değeridir. Formülsel olarak aralarındaki ilişki şu şekildedir:

Frekans (Hz) = 1 / Periyot (Saniye)
Periyot (T) = t_on (Açık Kalma Süresi) + t_off (Kapalı Kalma Süresi)

Standart analog servo motorlar (örn. TowerPro SG90 veya MG90S), kontrol sinyali olarak tam 50 Hz frekanslı ve 20 milisaniye periyotlu (T = 1 / 50\text{Hz} = 20\text{ms}) özel bir PWM sinyali talep ederler. Bu periyodun içindeki açık kalma süresi (t_{on}), servonun milinin hangi açıya (0 ila 180 derece) döneceğini belirler.

Servo Motor Kontrol Sinyali Fiziği

Standart bir analog servoda, 50 Hz frekanstaki sinyalin darbe genişliği (t_{on}) genellikle 1\text{ms} ile 2\text{ms} (bazı geniş açılı servolarda 0.5\text{ms} ile 2.5\text{ms}) arasında değişir:

  • 1.0\text{ms} (t_{on}) Darbe Genişliği: Servo milini 0 Derece (0^{\circ}) konumuna getirir.
  • 1.5\text{ms} (t_{on}) Darbe Genişliği: Servo milini 90 Derece (90^{\circ}) orta konumuna getirir.
  • 2.0\text{ms} (t_{on}) Darbe Genişliği: Servo milini 180 Derece (180^{\circ}) konumuna getirir.

Raspberry Pi Pico Donanımsal PWM Mimarisi

Raspberry Pi Pico’nun kalbinde yer alan RP2040 mikrodenetleyicisi, 8 adet bağımsız PWM dilimine (slice) sahiptir. Her bir dilim iki bağımsız çıkış kanalı (A ve B) yönetebilir, bu da toplamda 16 adet bağımsız PWM çıkışı anlamına gelir. Pico’nun tüm 30 adet GPIO pini PWM çıkışı olarak yapılandırılabilir, ancak aynı dilimi paylaşan pinlerin frekansları ortak olmak zorundadır. Projemizde, GPIO0 pinini donanımsal olarak PWM modunda yapılandırarak servo sinyal pini olarak kullanacağız.

Pico ve SG90 Servo Bağlantı Şeması

Analog servo motorların üç adet fiziksel kablosu bulunur. Renk kodları üreticiye göre değişse de genellikle şu şekildedir: Kahverengi veya Siyah kablo GND (Şase), Kırmızı kablo VCC (Besleme), Sarı veya Turuncu kablo ise Sinyal (PWM) girişidir.

Raspberry Pi Pico PWM ve Servo Kullanımı
Servo sinyal pini GPIO0’a, VCC ise Pico VBUS (5\text{V}) pinine bağlanmıştır

⚡ KRİTİK DONANIM VE BESLEME UYARISI:
Küçük boyutlu SG90 servo motorları dahi hareket anında veya zorlanma altında 500mA ila 1A arasında yüksek ani akımlar çekebilirler. Bu denli yüksek akımları doğrudan Pico’nun 3.3\text{V} çıkış pini üzerinden karşılamaya çalışmak, Pico donanımının anında kilitlenmesine (Brownout reset) ve hatta işlemci regülatörünün kalıcı hasar görmesine sebep olur.

Bu nedenle, tek bir küçük servo için beslemeyi Pico’nun USB 5\text{V} hattına doğrudan bağlı olan VBUS pininden almalısınız. Eğer birden fazla veya daha güçlü metal dişli servolar (örn. MG996R) kullanacaksanız, mutlaka harici bir 5V 2A regüleli DC güç kaynağı kullanmalı ve bu güç kaynağının GND hattı ile Pico’nun GND hattını ortaklamalısınız.

MicroPython ile Servo Kontrol Kodunun Yapılandırılması

Projeye ait orijinal kod deposuna Circuit Digest Servo Kontrol Kod Deposu üzerinden ulaşabilirsiniz. MicroPython’da `pwm.duty_u16()` fonksiyonu 16-bit çözünürlükle çalışır. Yani görev döngüsü oranı 0 ile 65535 arasında bir tam sayı olarak girilmelidir.

50 Hz (20\text{ms}) periyotta, 1\text{ms} ile 2\text{ms} arasındaki darbe sürelerini 16-bitlik duty çözünürlüğüne dönüştürmek için şu matematiksel formül kullanılır:

0.5ms Darbe Genişliği (Minimum Açı) -> (0.5ms / 20ms) * 65535 = 1638 (duty_u16)
2.5ms Darbe Genişliği (Maksimum Açı) -> (2.5ms / 20ms) * 65535 = 8192 (duty_u16)

Farklı analog servoların tolerans sınırlarına göre bu aralık genellikle 1638 ile 8192 arasında (kodumuzda güvenli sınırlar olan 1600 ila 8000 arası tercih edilmiştir) yapılandırılır. Thonny IDE üzerinde çalıştıracağımız tek parça tam MicroPython kodu şu şekildedir:

from machine import Pin, PWM
from time import sleep

# GPIO0 pinini donanımsal PWM çıkışı olarak tanımla
pwm = PWM(Pin(0))

# Analog servolar için standart 50 Hz frekansını ata
pwm.freq(50)

def setServoAngle(angle):
    """
    0 - 180 derece açısını 16-bit duty_u16 değerine dönüştürür.
    0 derece -> 0.5ms darbe genişliği (duty_u16: ~1638)
    180 derece -> 2.5ms darbe genişliği (duty_u16: ~8192)
    """
    # Girdi açısını 0-180 derece sınırlarında tut
    if angle < 0: angle = 0
    if angle > 180: angle = 180
    
    # Doğrusal interpolasyon formülü
    duty = int(1638 + (angle / 180) * (8192 - 1638))
    pwm.duty_u16(duty)
    sleep(0.02) # Mekanik hareketin tamamlanması için kısa gecikme

# Ana Program Döngüsü
while True:
    # 0 dereceden 180 dereceye yumuşak geçiş
    print("Açı artırılıyor: 0 -> 180")
    for degree in range(0, 181, 2):
        setServoAngle(degree)
        sleep(0.01)
        
    # 180 dereceden 0 dereceye yumuşak geçiş
    print("Açı azaltılıyor: 180 -> 0")
    for degree in range(180, -1, -2):
        setServoAngle(degree)
        sleep(0.01)

Yazdığınız bu kodu Thonny IDE arayüzünde Ctrl+Shift+S tuşlarına basarak “Raspberry Pi Pico” içine `main.py` adıyla kaydedin. Bu sayede, Pico’yu bilgisayarınızdan ayırıp harici bir 5V güç kaynağına bağladığınızda bile kod otomatik olarak çift çekirdekli paralellikte çalışmaya başlayacaktır.

Thonny main.py Kaydetme Aşaması

Kodu çalıştırdığınız an, Pico’nun GPIO0 çıkışından üretilen 50 Hz frekanslı dinamik darbe genişliği sinyalleri, SG90 servo motorunun milini 0 dereceden 180 dereceye ve ardından tersi yönde pürüzsüzce salındıracaktır. Projelerinizi genişletmek, çoklu servo kontrol mekanizmaları (robotik kollar) tasarlamak ve diğer donanımsal PIO modülasyonu ipuçlarını incelemek için Earle Philhower Topluluk Sayfasını ve resmi dokümanlarını inceleyebilirsiniz.

Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.