Raspberry Pi Pico eğitim serimizi beğendiğinizi umarak, Pico PWM içeriğimiz ile karşınızdayız. Bu eğitimde, MicroPython’daki PWM işlevini kullanarak Raspberry Pi Pico ile bir servo motoru kontrol edeceğiz. Şimdiye kadar bir OLED ile LCD’nin nasıl arabirim oluşturacağını öğrendik. Bununla birlikte, Raspberry Pi Pico ile I2C, ADC iletişimini nasıl uygulayacağımızı da öğrenmeliyiz. Şimdi bir darbe genişlik modülasyonunun nasıl çalıştığını anlayalım.
Pulse Width Modulation(PWM Darbe Genişliği Modülasyonu)
Darbe genişliği modülasyonu (PWM), güç veya elektrik gerektiren cihazları ve uygulamaları kontrol etmek için dijital sinyallerin genliğini değiştirmeye yönelik bir tekniktir. Bir dijital sinyalin açma ve kapama fazlarını hızlı bir şekilde çevirerek ve “açık” fazın veya görev döngüsünün genişliğini değiştirerek, voltaj bileşeni açısından bir cihaza iletilen güç miktarını etkin bir şekilde düzenler. Cihaza bu, açık kalma süresi oranıyla belirlenen ortalama voltaj değerine sahip sabit bir güç girişi olarak görünecektir. Görev döngüsü, tamamen (%100) açık olma yüzdesi olarak temsil edilir.
Yukarıdaki görüntü, %50 görev döngüsüne sahip bir PWM sinyalini temsil etmektedir. Görev döngüsünü %0’dan %100’e değiştirerek PWM sinyalinin “on time” durumunu kontrol edebiliriz. Belirli bir PWM sinyalinin görev döngüsünü değiştirerek bir servo motoru kontrol edeceğiz. Bir Periyot, yukarıdaki şekilde gösterildiği gibi bir PWM sinyalinin tam AÇIK ve KAPALI zamanıdır. Bir PWM sinyalinin frekansı, bir PWM’nin bir periyodu ne kadar hızlı tamamladığını belirler. Frekansı hesaplamak için kullanılan formüller aşağıda verilmiştir.
Frekans = 1/Zaman Periyodu Zaman Periyodu = Açma zamanı + Kapama zamanı
Normalde mikrodenetleyici tarafından üretilen PWM sinyalleri 500 Hz civarında olacaktır, bu tür yüksek frekanslar invertör veya dönüştürücü gibi yüksek hızlı anahtarlama cihazlarında kullanılacaktır. Ancak tüm uygulamalar yüksek frekans gerektirmez. Örneğin, bir servo motoru kontrol etmek için 50Hz frekanslı PWM sinyalleri üretmemiz gerekir. Ayrıca bir PWM sinyalinin frekansı da tüm mikrodenetleyiciler için program tarafından kontrol edilebilir. Daha fazla bilgi için PWM nedir: Darbe Genişliği Modülasyonu makalemize göz atabilirsiniz.
Bağlantı Şeması
Bir servo motorun bağlantısı gerçekten basittir. Bir servo motorun üç kablosu olduğunu biliyoruz. Siyah veya kahverengi kablo GND içindir, kırmızı kablo VCC olarak kullanılır ve sarı veya turuncu kablo darbe sinyalini sağlamak için kullanılır. Devre şemasında servonun VCC’sini Pico kartının VBUS pinine bağladığımızı görebilirsiniz. Servo motorun Sinyal pini Pico kartının GPIO0’una ve servonun GND pini Pico kartının GND pinine bağlanmıştır.
MicroPython’da Raspberry Pi Pico Servo Motor Kontrol Kodu
Raspberry Pi Pico için gereken kütüphaneyi buradaki GitHub deposundan klonlamanız gerekir. Bu klasörün içinde “code” klasörünü bulabilirsiniz. Thonny düzenleyicisinde “main.py”python dosyasını açın. Şimdi main.py dosyası hakkında konuşalım.
from machine import Pin, PWM from time import sleep
Öncelikle Pin() ve PWM() sınıflarını yukarıda bahsettiğimiz gibi machine.py kütüphanesinden import etmemiz gerekiyor. Önceki eğitimlerimizde makine kitaplığını pek çok kez kullandık ve umarım artık makine kitaplığına aşinasınızdır. Pin(), servo motorun sinyal pinini bildirmek için kullanılır.
pwm = PWM(Pin(0)) pwm.freq(50)
Servo motorun sinyal pinini Pico kartının GPIO0’una bağladığımız için, Pin(0)’i tanımladık ve bu pini PWM() işlevine geçirerek PWM olarak ayarladık. PWM değişkeni burada bir nesne olarak kullanılır. Daha sonra pwm.freq(50) kullanarak frekansı 50Hz olarak atadık.
def setServoCycle (position): pwm.duty_u16(position) sleep(0.01)
setServoCycle(position) işlevi, position parametresini 1000’den 9000’e geçirerek servonun konumunu ayarlamak için kullanılabilir. duty_u16 değerleri derece yerine mikrosaniye cinsindendir. 1000-9000 servo değerleri 0-180 dereceyi temsil eder.
while True: for pos in range(1000,9000,50): setServoCycle(pos) for pos in range(9000,1000,-50): setServoCycle(pos)
Yukarıdaki while döngüsünde, iki for döngüsü kullanıyoruz. Birincisi, servo konumunu 0’dan 180’e, yani 1000’den 9000’e ayarlamak için kullanılır ve ikincisi for döngüsü, servo konumunu 180’den 0’a, yani 9000’den 1000’e ayarlamak için kullanılır. Başlamak için klavyenizdeki “ctrl+shift+s” tuşlarına basarak “main.py” dosyasını Pico kartına kaydedin. Dosyaları kaydetmeden önce Pico kartınızın bilgisayarınıza bağlı olduğundan emin olun. Kodu kaydettiğinizde, aşağıdaki resimde gösterildiği gibi bir açılır pencere görünecektir, önce Raspberry Pi Pico’yu seçmeli, ardından dosyayı “main.py” olarak adlandırmalı ve kaydetmelisiniz. Bu prosedür, Pico AÇIK konuma getirildiğinde programı çalıştırmanızı sağlar.
Kodu pico board’a yükleyip çalıştırdığınızda servonun sürekli olarak 0’dan 180 dereceye ve 180’den 0 dereceye döndüğünü göreceksiniz.
from time import sleep from machine import Pin from machine import PWM pwm = PWM(Pin(0)) pwm.freq(50) def setServoCycle (position): pwm.duty_u16(position) sleep(0.01) while True: for pos in range(1000,9000,50): setServoCycle(pos) for pos in range(9000,1000,-50): setServoCycle(pos)