ESP32 PWM Kullanımı
ESP32 PWM kullanımı, analog çıkışlar almak için kullanılan bir fonksiyondur. Bu yazıda size Arduino IDE kullanarak ESP32 ile PWM sinyallerinin nasıl üretileceğini göstereceğiz. Örnek olarak, ESP32’nin LED PWM denetleyicisini kullanarak bir LED’i karartan basit bir devre oluşturacağız. Aynı zamanda farklı GPIO’larda aynı PWM sinyalini nasıl alabileceğinizi de göstereceğiz.
ESP32’yi Arduino IDE kullanarak programlayacağız, bu yüzden devam etmeden önce ESP32 kütüphanesinin kurulu olduğundan emin olun:
Arduino IDE’ye ESP32 Desteği Kurmak (Windows, Linux, MacOS)
Gerekli Malzemeler
- ESP32 Geliştirme Kartı(DOIT DEVKIT V1)
- 5mm LED x 3
- 330Ω Direnç x 3
- Breadboard(devre tahtası)
- Bağlantı Kabloları
ESP32 LED PWM Kontrolü
ESP32, farklı özelliklere sahip PWM sinyalleri üretmek üzere yapılandırılabilen 16 bağımsız kanala sahip bir LED PWM kontrolörüne sahiptir.
Arduino IDE kullanarak PWM ile bir LED’i karartmak için izlemeniz gereken adımlar şunlardır:
- Öncelikle bir PWM kanalı seçmeniz gerekiyor. 0’dan 15’e kadar 16 kanal var.
- Ardından, PWM sinyal frekansını ayarlamanız gerekir. Bir LED için 5000 Hz frekansı kullanmak uygundur.
- Ayrıca sinyalin görev döngüsü çözünürlüğünü de ayarlamanız gerekir: 1 ila 16 bit arasında çözünürlükleriniz vardır. 8 bit çözünürlük kullanacağız; bu, LED parlaklığını 0 ile 255 arasında bir değer kullanarak kontrol edebileceğiniz anlamına gelir.
- Ardından, sinyalin hangi GPIO veya GPIO’larda görüneceğini belirlemeniz gerekir. Bunun için aşağıdaki işlevi kullanacaksınız:
ledcAttachPin(GPIO, kanal)
Bu fonksiyon iki argüman kabul eder. Birincisi sinyali verecek olan GPIO, ikincisi ise sinyali üretecek olan kanaldır.
- Son olarak, PWM kullanarak LED parlaklığını kontrol etmek için aşağıdaki işlevi kullanacaksınız:
ledcWrite(kanal, görev döngüsü)
Bu fonksiyon, PWM sinyalini oluşturan kanalı ve görev döngüsünü argüman olarak kabul eder.
Devre Şeması
Aşağıdaki şematik diyagramdaki gibi ESP32’nize bir LED bağlayın. LED, GPIO 16’ya bağlanmalıdır.
Not: Çıkış görevi görebildiği sürece istediğiniz pini kullanabilirsiniz. Çıkış görevi görebilecek tüm pinler PWM pinleri olarak kullanılabilir. Hangi pini kullanacağınızı bilmiyorsanız, buradaki referans pinleri yazımıza bakabilirsiniz.
Arduino Kodu
// LED pin numarası
const int ledPin = 16; // 16, GPIO16'ya karşılık gelir
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup(){
// LED PWM işlevlerini yapılandırır
ledcSetup(ledChannel, freq, resolution);
// kontrol edilecek kanalı GPIO'ya ekler
ledcAttachPin(ledPin, ledChannel);
}
void loop(){
// LED parlaklığını artırır
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// PWM ile LED parlaklığını değiştirme
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
// LED parlaklığını azalt
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// PWM ile LED parlaklığını değiştirme
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}
LED’in bağlı olduğu pini tanımlayarak başlıyoruz. Bu durumda LED, GPIO 16’ya bağlıdır.
const int ledPin = 16;
Ardından, PWM sinyal özelliklerini ayarlıyoruz. 5000 Hz’lik bir frekans tanımladık, sinyali oluşturmak için kanal 0’ı seçtik ve 8 bitlik bir çözünürlük ayarladık. Farklı PWM sinyalleri oluşturmak için bunlardan farklı özellikler seçebilirsiniz.
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
setup()‘ta, daha önce tanımladığınız özelliklerle, argüman olarak kabul eden ledcSetup() fonksiyonunu, ledChannel‘ı, frekansı ve çözünürlüğü aşağıdaki gibi kullanarak LED PWM’yi yapılandırmanız gerekir:
ledcSetup(ledChannel, freq, resolution);
Ardından, sinyali alacağınız GPIO’yu seçmemiz gerekir. Bunun için, sinyali almak istediğiniz GPIO’yu ve sinyali üreten kanalı bağımsız değişken olarak kabul eden ledcAttachPin() işlevini kullandık. Bu örnekte, ledPin GPIO’da GPIO 16’ya karşılık gelen sinyali alacağız. Sinyali üreten kanal, kanal 0’a karşılık gelen ledChannel’dir.
ledcAttachPin(ledPin, ledChannel);
Döngüde, LED parlaklığını artırmak için görev döngüsünü 0 ile 255 arasında değiştiriyoruz.
// LED parlaklığını artırır
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// PWM ile LED parlaklığını değiştirme
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
Ardından, parlaklığı azaltmak için 0 ile 255 arasında değerler değişir.
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// PWM ile LED parlaklığını değiştirme
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
LED’in parlaklığını ayarlamak için, sinyali üreten kanalı ve görev döngüsünü argüman olarak kabul eden ledcWrite() işlevini kullanmanız yeterlidir.
ledcWrite(ledChannel, dutyCycle);
8 bit çözünürlük kullandığımız için görev döngüsü 0 ile 255 arasında bir değer kullanılarak kontrol edilecektir. ledcWrite() işlevinde GPIO’yu değil, sinyali üreten kanalı kullandığımızı unutmayın.
Kodu ESP32’nize yükleyin. Doğru kartın ve COM bağlantı noktasının seçili olduğundan emin olun. Devrenize bakın. Parlaklığı artıran ve azaltan dimmer bir LED’iniz olmalıdır.
Farklı GPIO’larda Aynı Sinyali Alma
Farklı GPIO’larda aynı kanaldan aynı sinyali alabilirsiniz. Bunu başarmak için, bu GPIO’ları setup() üzerindeki aynı kanala eklemeniz yeterlidir.
Aynı kanaldan aynı PWM sinyalini kullanarak 3 LED’i kısmak için önceki örneği değiştirelim.
Devre Şeması
Aşağıdaki şematik diyagramı izleyerek devrenize iki LED daha ekleyin:
(Bu şema, 30 GPIO’lu ESP32 DEVKIT V1 modül sürümünü kullanır – başka bir model kullanıyorsanız, lütfen kullandığınız kartın pin çıkışını kontrol edin.)
Arduino Kodu
// LED pin numarası
const int ledPin = 16; // 16, GPIO16'ya karşılık gelir
const int ledPin2 = 17; // 17, GPIO17'ye karşılık gelir
const int ledPin3 = 5; // 5, GPIO5'e karşılık gelir
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup(){
// LED PWM işlevlerini yapılandırır
ledcSetup(ledChannel, freq, resolution);
// kontrol edilecek kanalı GPIO'ya ekler
ledcAttachPin(ledPin, ledChannel);
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);
}
void loop(){
// LED parlaklığını artırır
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// PWM ile LED parlaklığını değiştirme
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
// LED parlaklığını azalt
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// PWM ile LED parlaklığını değiştirme
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}
Bu, öncekiyle aynı koddur, ancak bazı değişiklikler yapılmıştır. GPIO 17 ve GPIO 5’e atıfta bulunan iki yeni LED için iki değişken daha tanımladık.
const int ledPin2 = 17; // 17, GPIO17'ye karşılık gelir
const int ledPin3 = 5; // 5, GPIO5'e karşılık gelir
Ardından setup() içinde, her iki GPIO’yu kanal 0’a atamak için aşağıdaki satırları ekledik. Bu, her iki GPIO’da da kanal 0’da üretilen aynı sinyali alacağımız anlamına gelir.
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);
Yeni kodu ESP32’nize yükleyin. Doğru kartın ve COM bağlantı noktasının seçili olduğundan emin olun. Şimdi devrenize bir göz atın:
Tüm GPIO’lar aynı PWM sinyalini veriyor. Böylece, üç LED’in tümü aynı anda parlaklığı artırır ve azaltır, bu da senkronize bir etki ile sonuçlanır.
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.