ESP32 Kullanımı (Arduino ile Programlama)
|
Merhaba,
Bu konuda ESP32 geliştirici kartının Arduino kullanarak nasıl programlayacağımıza değineceğiz. Öncelikle ESP32′ nin ne olduğu ile başlayalım.
ESP32, üretici firması olan ESPRESSIF’ in sayfasında da yazdığı üzere çok çeşitli uygulamalar için entegre Wi-Fi ve Bluetooth bağlantısına sahip, zengin özelliklere sahip bir mikrodenetleyicidir. Aslında bu cümle ESP32′ nin ne olduğunu özetlemek için yeterli. Ancak biz biraz daha detaylarına bakmaya çalışalım. Bu konuda elimden geldiğince kullanışlı yanlarından bahsetmeye çalışacağım. Daha az gerekli detaylara yer vermemeye çalışacağım.
ESP32 üzerindeki Wi-Fi ile Bluetooth sayesinde bir çok IOT uygulaması için kullanışlı bir yapıya sahiptir. ESP8266′ da olduğu gibi hazır çip üzerinde modüler yapıya sahip ESP32 modülleri sayesinde kendi PCB kartı tasarımınızı yapmanız da oldukça kolaylaşmaktadır. Ayrıca uyku modunda sahip olduğu düşük güç tüketimi özelliği sayesinde, düşük güç tüketimli uygulamalar için de kullanıma uygundur. ESPRESSIF sayfası, tercih edeceğiniz modülün seçimi yada başlangıçta yapılması gerekenler için detaylıca anlatımlar içermekte. Ancak o sayfada yazanlar ESP-IDF SDK için kullanıma yönelik anlatımlar içermektedir. Arduino IDE’ si ile kullanacaklar için çok faydalı bilgiler içermemektedir.

ESP32 WROOM ve WROVER çeşitleri, isimleri “Core 0” ve “Core 1” olmak üzere iki adet çekirdeğe sahiptir. Hangi çekirdeğin hangi işi yapacağını basit bir kaç işlem ile belirlemeniz mümkün. Bu “multi threading” kavramı ile benzer gibi olsa da aslında iki işlemin de aynı anda gerçekleşebilmesi özelliği ile daha faydalı bir durumdur. Bir örnek olması açısından ESP32 ile oluşturacağınız bir Web Server ve Step Motor sürme işlemleri aynı anda kesintisiz gerçekleştirilebilir. Eğer bir seçim yapmadan doğrudan Arduino IDE’ si ile kullanım yaparsanız, ESP32 işlemleri “Core 1” üzerinde gerçekleştirir. Çekirdek seçim işlemine bu konuda değinmeyeceğim detay için bağlantıdaki konuya bakabilirsiniz.
ESP32 80 ile 240 Mhz arasında ayarlanabilir saat hızına sahiptir. Bu ayarlama işlemi Arduino IDE’ si üzerinde yazılım yüklenirken yapılabilir. Seçim işlemini ihtiyacınıza göre yapabilirsiniz. Yüksek performans isteyen uygulamalarda 240Mhz seçebilir, ama daha az güç tüketilmesi istenilen uygulamalarda 80Mhz seçilebilir. Ayrıca sahip olduğu dahili hafıza da kimi modellerde 16Mb’ e kadar çıkabilmekte ki bu da büyük yazılımlarda çok kullanışlı olmaktadır.
GPIO
Şimdi ESP32′ nin GPIO’ larına bir bakalım. Arduino ile ESP32 kullanımı hakkındaki bir çok konu için bağlantıdaki siteyi öneririm. İçerik olarak dolu ve resimler ile destekli anlatıldığından benin düşünceme göre kullanışlı bir sayfa. Bu konu içerisindeki içeriklerde de o siteden alıntılar bulunmaktadır. ESP32 modülünün pin referansı ile başlayalım.

Resimde görüldüğü üzere ESP32 üzerinde bir çok pin bulunmakta. Ancak bu pinlerin hepsini GPIO olarak doğrudan kullanmak çok mümkün değil. Özellikle GPIO9 ile GPIO11 arasındaki pinleri herhangi bir işlem için kullanmak kesinlikle önerilmemektedir. Çünkü bu pinler ESP32′ nin flash hafızasına bağlılar. Ayrıca GPIO34 ile GPIO39 arası pinleri sadece giriş olarak kullanabiliyor. Çıkış olarak kullanmak maalesef ki mümkün değil. Buna ek olarak bazı pinlerin de başlangıçtaki davranışları farklı. Örneğin GPIO12 pinini ESP32′ ye güç verirken HIGH konumunda tutmak ESP32′ nin çalışmasına engel olmakta. Bunlar ESP32′ nin yapısından kaynaklı özellikler olduğu için değiştirebilmek mümkün değil. Bu sebeple tasarlayacağınız sistemlerde bağlantıdaki sayfada bulunan GPIO tablosunu incelemek meydana gelebilecek hataları en aza indirmek açısından önemlidir.
Çevre Birimleri
Arduino’ dan yada STM32′ den alışık olduğumuz ADC, SPI, I2C yada DAC gibi donanımlarda ESP32 üzerinde mevcut. Ancak bunlara ek olarak ESP32 üzerinde dahili kapasitif özellikte “Touch” pinleri ve “Hall Efect” sensörü bulunmakta. Hall efect sensörü manyetik alanda meydana gelen değişimleri ölçebilirken Touch pinleri ise kablo aracılığı ile bağladığınız metal yüzeyin dokunmatik bir sensöre dönüşmesini sağlamaktadır. Yani pinden okuduğunuz değer metal yüzeye dokunduğunuzda farklı dokunmadığınızda farklı değerler algılamasını sağlamaktadır.
ESP32′ de kullanılan ADC ve PWM, Arduino’ da kullanıma göre biraz daha fazla detay içeriyor. ADC’ yi ek ayar yapmadan basitçe kullanmak mümkünken, PWM kullanmak için ek ayarlamalar yapılması gerekli. Çünkü PWM kullanırken, frekans, kanal ve kanalın kullanılacağı pin manuel olarak ayarlanmalı. Aslında bu dezavantaj gibi gözükse de ESP32 üzerindeki bütün pinlere bu sayede PWM özelliği verilebilmektedir. ESP32′ de kullanılan ADC 12 bit’ e kadar kullanılabilir.
PWM’ de olduğu gibi I2C haberleşmesi için de ESP32 üzerindeki bütün pinler kullanılabilir. Ancak Arduino IDE’ sini kullanırken GPIO21 ve GPIO22 default I2C pinleri olarak ayarlanmış. Değişmek isterseniz “Wire.begin()” fonksiyonuna kullanmak istediğiniz pinleri parametre olarak vermeniz yeterlidir. Tabi kullanacağınız pinin ESP32 GPIO tablosunda verilen kısıtlamalardan herhangi birine sahip olmaması gerekir. Yani GPIO36 sadece giriş olduğu için I2C olarak kullanmanız soruna sebep olabilir.
Bunlara ek olarak ESP32 de 4 adet SPI ve 1 adet 2 kanallı DAC vardır. SPI’ ların sadece 2 tanesi kullanıma açıktır. Bunlarda VSPI ve HSPI olarak isimlendirilirler. Aralarında herhangi bir fark göremedim. Sadece isimlendirme olarak farklı isimlendirilmişler. Diğer SPI’ lar flash hafıza için kullanılır.
Benim düşüncem ile ESP32′ deki en büyük dezavantaj, Wi-Fi aktif edildiğinde ESP32 üzerindeki bazı donanımlar kullanılamaz duruma gelmekte. Bunlardan en çok bilineni Wi-Fi aktif iken ADC2′ yi kullanmak mümkün olmuyor. İkinci en büyük dejavantaj ise bir çok ESP32 modülünün breadboard ile uyumlu olmaması. Bu sebeple biraz kullanım zorluğu çıkarmakta. Ayrıca ESP32 kullanırken pinlerin en fazla 40mA akım verebileceğini unutmayın.
Arduino IDE Kurulumu
ESP32′ yi Arduino ile programlayabilmek için Arduino IDE’ si üzerinde paket yüklemesi yapılmalıdır. Bu işlemi basitçe anlatan adımlar aşağıda resimde görüldüğü gibi 4 adımda gerçekleştirilebilir. Verilen işlem adımlarından 2. adımda “Additional Board Manager URLs” kısmına şu URL girilmelidir. Farklı URL daha önceden kullanmışsanız, yeni ekleyeceğiniz URL’ yi virgül ile ayırarak ekleyebilirsiniz.
https://dl.espressif.com/dl/package_esp32_index.json
Altta verilen resimde bulunan ilk iki adım “File” sekmesinden, diğer iki adım ise “Tools” sekmesinden gerçekleştirilmelidir. IDE’ yi türkçe kullananlar için seçeneklerin yerleşimi farklı değildir. Daha detaylı olarak kuruluma bağlantıdan ulaşabilirsiniz.

5 numaralı adım IDE üzerinde benim kullandığım kart için yaptığım seçimi göstermektedir. Arduino IDE’ si üzerinden 1.8.13 versiyonunu yüklediğinizde farklı kartlar için hiyerarşik seçim özelliği eklenecektir. Böylece ihtiyacınız olanı kartı seçmek daha kolay olacaktır.
Devre Şeması
Şimdi ESP32 ile basit bir uygulamaya yer verelim. Bu konu daha çok ESP32′ yi tanıma amaçlı olduğu için basit bir uygulama yapmayı tercih ettim. Yapacağımız uygulamada ADC’ den okuduğumuz değere göre iki ayrı LED’ in parlaklığını değiştirelim. Öncelikle bağlantı şemasından başlayalım.
Şimdi yazılıma gelelim. Yazılım için Arduino kullanacağımızı belirmiştim. Arduino IDE’ si üzerinde yazılım yüklerken bazı seçimler yapılması gerekli. Bunlar için benim seçtiğim ayarlarda normal ayarlara ek olarak “Flash Size” 16Mb, “CPU Frequecy” ise 240Mhz seçilmiştir. Cpu Frequency seçeneğini keyfi olarak seçebilirsiniz. Ancak Flash Size kullandığınız ESP32′ nin hafızasına göre seçmelisiniz.
Yazılım aşamasına geçmeden, Arduino’ da hazırlanan yazılımın sorunsuz bir şekilde ESP32′ ye yüklenebilmesi için, yükseleme sırasında ESP32 üzerindeki “BOOT” tuşuna basılı tutulması gerekmektedir. Yükleme başlayınca elinizi kaldırabilirsiniz. Bu buton ESP32 üzerinde aşağıdaki şekilde görünmektedir.

Yazılım
Şimdi yapacağımız uygulama için pwm ve adc ayarlamalarına bakalım.
- PWM ayarlanırken öncelikle kullanılacak PWM kanalları belirlenir. ESP32′ de en fazla 16 adet PWM kanalı kullanılabilir. Bu sebeple 0 ile 15 arasında değişen PWM kanalı numarası seçebiliriz.
- Daha sonra kullanılacak PWM frekansı ayarlanmalıdır. Bunun için ihtiyacınıza göre PWM frekansı belirleyebilirsiniz. Ancak 8 Bit çözünürlük için en yüksek PWM frekansı 300 Khz civarlarındadır. Bit sayısı azaldıkça kullanılabilir PWM frekans değeri daha yukarıya çıkmaktadır. Tabi bu kullandığınız işlemci frekansı ile de alakalı bir değerdir.
- Frekans seçimi işleminden sonra sıra çözünürlük belirlemede. Önceki adımda da belirttiğimiz gibi eğer yüksek frekanslarda PWM kullanacaksak seçebileceğimiz en yüksek çözünürlük değeri küçülüyor. Ancak 5 Khz gibi küçük değerlerde 16 Bit’ e kadar çözünürlük seçebiliriz.
- Son olarak da kullandığımız PWM kanalını ESP32 üzerindeki bir pine bağlamalıyız
Yukarıda verilen işlem adımları Arduino IDE’ si ile iki satır yazılımda gerçekleştirilebilmektedir. Verilen kod satırlarından ilki seçilen PWM kanalının frekansını ve çözünürlüğünü belirlemeye yarar. İkinci satır ise ayarları yapılan LED kanalını ESP32 üzerindeki seçilen pine bağlamayı sağlar.
ledcSetup(ledChannel1, freq, resolution);
ledcAttachPin(ledPin1, ledChannel1);
PWM ayarlarını bu şekilde yaptık. PWM kullanmak için bu ayarları yapmak zorunludur. Bunlara ek olarak birde PWM’ in çevrim oranını ayarlayacağımız bir fonksiyon bulunmaktadır. Onu da basit olarak şu şekilde yapabilirsiniz. Fonksiyona parametre olarak kullanılan PWM kanalı ve çevrim oranı değeri verilmelidir.
ledcWrite(ledChannel1, adcVal1);
Son olarak ADC ayarı için ilgili işlemleri yapalım. ADC kullanımı için daha önce de belirttiği gibi herhangi bir ayar yapmadan doğrudan kullanmak mümkündür. Lakin PWM’ i 10 bit çözünürlükte ayarladık. Bu sebeple ADC’ den okunan değeri PWM olarak doğrudan kullanabilmek için aynı çözünürlükte olmalılar. ADC’ nin çözünürlüğünü değiştirmek için aşağıdaki fonksiyonu kullanabiliriz. Parametre olarak kullanmak istediğiniz ADC çözünürlüğünü girebilirsiniz.
analogReadResolution(resolution);
Yapacağımız uygulamanın setup fonksiyondaki PWM ve ADC işlemleri basitçe şu şekildedir.
// set pwm channels freq and resolution
ledcSetup(ledChannel1, freq, resolution);
ledcSetup(ledChannel2, freq, resolution);
// connect led pins to pwm channels
ledcAttachPin(ledPin1, ledChannel1);
ledcAttachPin(ledPin2, ledChannel2);
// set adc resolution same as pwm resolution
analogReadResolution(resolution);
Loop kısmında ise ADC den okunan değerleri PWM çevrim oranı olarak ayarladık. Bunu da basitçe şu şekilde gerçekleştirebiliriz.
int adcVal1 = analogRead(potPin1);
int adcVal2 = analogRead(potPin2);
// set analog values as a duty cycle to pwm channels
ledcWrite(ledChannel1, adcVal1);
ledcWrite(ledChannel2, adcVal2);
Yazılımın tamamına bağlantıdan ulaşabilirsiniz. Başta da dediğim gibi bu konu basit olarak ESP32′ yi tanıtma amaçlı idi. İlerleyen zamanlarda Wi-Fi içerikli konular paylaşmayı düşünüyorum.
İyi çalışmalar dilerim…
merhaba esp 32 lite esp 32 ile aynı şekilde kodlanmıyor sanırım uğraşıyorum ama başaramadım
Merhaba, evet kodlama şekli aynıdır ancak yaşadığınız sorunu daha detaylı olarak baser61061@gmail.com adresine mail gönderebilirseniz yardımcı olmaya çalışırım. Yüklemede sorun yaşıyorsanız elinizdeki ESP32 modelini yükleme seçeneklerindeki cihazlar arasından seçmelisiniz. Cihazların bootlader’ leri değişiklik gösterebilir. İyi çalışmalar dilerim…