1.4 - ESP32'yi Tanıyalım

ESP32, Espressif firmasının üretmiş olduğu bir Wi-Fi mikrodenetleyicidir. ESP32’ye geçmeden önce Espressif’in bu pazarda nasıl bir değişime sebep olduğuna bakalım.

Espressif’in ilk Wi-Fi mikrodenetleyicisi olan ESP8266 2014–2015 yılları arasında maker topluluğu arasında popülerlik kazanmaya başladı. Bundan daha öncesinde Wi-Fi modüller ve mikrodenetleyiciler mevcut olsa da kısıtlı bir pazara hitap etmekte ve fiyatları en düşük ortalama 25–30 dolar arasında seyretmekteydi. Pahalı olan modüller haliyle bütçesi kısıtlı olan amatör, hobici ve öğrenci kitlesinin ortak adı olan “maker” topluluğu arasında o zamana kadar yer edinememişti. Bir donanımın topluluğu yeterli olmadıktan sonra o donanım hakkında örnek projeler, kütüphaneler ve teknik destek bulabileceğiniz yerler de kısıtlıydı. ESP8266 piyasaya sürüldüğünde Çin siteleri üzerinden sadece 1–2 dolara alınabilen ve dünyanın hemen her yerine posta ile ücretsiz gönderilen modüller olarak karşımıza çıktı. İlk zamanlar kaynak bakımından sıkıntılar yaşansa da ucuz olması bütün bunların önüne geçti ve bunlarla yapılan çeşitli çalışmalar günümüze kadar devam etti. Wi-Fi mikrodenetleyiciler arasında ucuzluğu ile rakipsiz sayılabilecek bu mikrodenetleyiciler aynı zamanda performans yönüyle de diğer mikrodenetleyicilerin yerine kullanılabilecek seviyedeydi. Zamanla üreticinin temel kaynakları doğru düzgün sağlaması (datasheet, referans kılavuzu, SDK vb.) ve geliştirici topluluğunun kütüphane ve frameworkler ile desteklemesiyle günümüzde ESP mikrodenetleyiciler üzerinde pek çok farklı yoldan çalışma imkanına sahip olduk.

Daha iyi bir haber ise üretici firmanın ESP8266’dan sonra ESP32 mikrodenetleyicisini piyasaya arz etmesi oldu. ESP8266’nın nispeten kısıtlı çevre birimlerini geliştiren ve ESP’yi kullanım amacı yönüyle Wi-Fi modülden ziyade Wi-Fi mikrodenetleyici kategorisine sokan bu gelişmeden sonra daha gelişmiş mikrodenetleyiciler olarak ESP32-C ve ESP32-S serileri piyasaya arz edildi. Günümüzde ESP8266'nın çevrebirimi özelliklerinin kısıtlılığından dolayı geliştirici kitlesi tarafından ESP8266 yerine genellikle ESP32 tercih edilmektedir. ESP32’nin üst serileri daha gelişmiş özelliklere sahip olsa da ESP32 kadar yaygın ve ucuz değildir. ESP32 serisi Wi-Fi ve Bluetooth özellikleriyle özellikle nesnelerin interneti (IoT) uygulamaları için hem uygun hem etkili bir seçenek olmakta, yüksek seviye (high-level) kütüphaneleri ve programlama dilleri ile yazılım camiasından pek çok geliştiricinin ilgisini çekmekte hem de ESP-IDF SDK ile daha alt seviye (C/C++) olarak programlandığı için gömülü sistem geliştiricilerine uygun bir ortam da sunmaktadır.

ESP32 Donanımı

Kitapta kullanacağımız kartta ESP-WROOM-32 modülü kullanılmaktadır. Bu modülün içinde ise ESP32 mikrodenetleyici yer almaktadır. ESP-WROOM-32 modülünde ESP32-D0WDQ6 mikrodenetleyicinin kullanıldığını aşağıdaki listeden görebilirsiniz. Bunun yanında ESP32 içerisinde pek çok farklı modelin yer aldığına dikkat ediniz.

https://www.espressif.com/en/products/socs

Kullanacağımız denetleyicinin ve modülün datasheetine aşağıdaki linklerden erişmekteyiz.

https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf

https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf

Şimdi datasheetten öğrendiğimiz bilgilerle ESP32’nin özelliklerinden kısaca bahsedelim.

· Wi-Fi (802.11 b/g/n)
· Bluetooth v4.2
· 1 / 2 çekirdek Xtensa 32-bit LX6 mikroişlemci (240MHz)
· 448KB ROM
· 520KB SRAM
· 16KB RTC’de SRAM
· Harici Flash/SRAM çipleri için QSPI desteği
· Dahili 8 MHz osilatör
· Dahili RC Osilatör
· Harici 2–60MHz osilatör desteği (Wi-Fi ve BT için 40MHz)
· İki adet zamanlayıcı grubu, 2 x 64-bit zamanlayıcı ve her bir grupta bir koruma zamanlayıcısı
· Bir adet RTC zamanlayıcı
· RTC koruma zamanlayıcısı
· 34 adet programlanabilir giriş ve çıkış
· 12-bit SAR ADC (18 kanala kadar)
· 2x 8-bit DAC
· 10x dokunma algılayıcısı
· 4x SPI
· 2x I2S
· 2x I2C
· 3x UART
· 1 host (SD/eMMC/SDIO)
· 1 uydu (SDIO/SPI)
· Ethernet MAC arayüzü
· TWAI, CAN uyumlu (Otomobillerde kullanılan iletişim sistemi)
· RMT (TX/RX) (Kızılötesi alıcı/verici)
· Motor kontrol PWM
· LED PWM (16 kanala kadar)
· Hall algılayıcısı
· Güvenli başlatma
· Flash hafıza şifreleme
· Kriptografi için donanım hızlandırması

Görüldüğü gibi oldukça zengin çevre birimlerine sahip bir mikrodenetleyici var. Bunun yanında performans yönüyle de hiç geri kalmadığını görüyoruz. Datasheette uygulama alanları için bazı örnekler verilmiş. Bunları şu şekilde sıralayabiliriz.

· Genel IoT sensör uygulamaları, veri günlüğü tutucular
· Kameralar, masaüstü medya aygıtları
· Konuşma tanıma, resim tanıma, birbiriyle bağlantılı ağlar (mesh)
· Ev otomasyonu (Aydınlatma kontrolü, akıllı prizler, akıllı kapı kilitleri)
· Akıllı binalar (Akıllı aydınlatma, enerji izleme)
· Endüstriyel otomasyon (Endüstriyel kablosuz kontrol, robotik)
· Akıllı tarım (Seralar, sulama sistemleri, tarımsal robotik)
· Ses uygulamaları (Internet müzik çalarlar, yayın araçları, internet radyo oynatıcılar, kulaklıklar)
· Sağlık uygulamaları (Sağlık durumu izleme, bebek monitörleri)
· Wi-Fi destekli oyuncaklar (Uzaktan kumandalı, yakınlık algılayan ve eğitim oyuncakları)
· Pos makinaları ve servis robotları

Bu verilen liste mikrodenetleyicinin kullanımının uygun olabileceği yerler olmakla beraber başka alanlarda da kullanmamız mümkündür. Mikrodenetleyicinin hangi uygulamaya uygun olup olmadığını belirleyen pek çok faktör bulunduğu için bu konuda kesin bir değerlendirme yapmak güçtür.

Resim: ESP32 fonksiyonel blok diyagramı (ESP-32 Datasheet)

ESP-WROOM-32 Modülü

Kullanacağımız NodeMCU-32S kartında bulunan bu modül aslında ESP32 mikrodenetleyicisinin çalışması için gereken donanımları üzerinde bulunduran ve kolayca baskı devre kartına entegre edilebilen noktalara sahip olan bir ufak karttır. Günümüzde bu tarz modül sistemler (System-on-Module) popülerlik kazanmaya başlamıştır.

Resim:ESP-WROOM-32 modülünün iç yapısı. (fccid.io)

Bu modül geliştirme kartımızın temelini oluşturmakla beraber ileride yapacağınız tasarımlarda da kullanıma müsaittir. Modülün devre şemasına baktığımızda 40MHz kristal, Flash hafıza entegresi, ESP32 mikrodenetleyici, filtre kondansatörleri, anten devresi ve mikrodenetleyicinin çıkış ayakları olan padlere (baskı devre delikleri) olan bağlantıları görmekteyiz.

Datasheette dikkat etmemiz gereken iki nokta mevcuttur. Bunun birincisi GPIO9-GPIO11 arası bağlantılar modüldeki SPI Flash hafızaya bağlanmaktadır. Bu yüzden başka amaçla kullanılmaması gereklidir.

İkinci nokta ise MTDI, GPIO0, GPIO2, MTDO ve GPIO5 ayakları bağlı ayaklar (strapping pins) olarak tanımlanmaktadır. Yani açılış esnasında bu ayakların giriş durumuna göre bazı konfigürasyonlar yapılmakta reset salıvermesinden sonra ise kullanıcı bu ayakları kullanabilmektedir. Bu bitlerden Internal LDO ve SDIO uydu zamanlama bitleri yazılımla konfigüre edilebilmektedir.

NodeMCU-32S Kartı

Kullanacağımız geliştirme kartına baktığımızda üzerinde ESP-WROOM-32 modülünün yanı sıra AMS1117 3.3V gerilim regülatörü, CP2102 USB-TTL dönüştürücü, bir adet LED ve iki düğme bulunmaktadır.

Resim: NodeMCU-32S kartı (elektor.com)

Kartın datasheetine aşağıdan erişebilirsiniz.

https://docs.ai-thinker.com/_media/esp32/docs/nodemcu-32s_product_specification.pdf

Uygulamalarda sıkça bakmamız gereken ayak haritası ise datasheette yer almaktadır. Kartın hangi tarafı olduğunu karıştırmamanız adına USB konnektörün olduğu kısmı işaretledim.

Yukarıdaki şema 38 ayaklı olan kartlar için olsa da kitaptaki uygulamaları başka kartlarla da yapma imkânınız vardır. Kullandığınız kartın bağlantı şemasını indirip bunlara dikkat ettikten sonra bir sorun yaşamazsınız. İsterseniz diğer ESP mikrodenetleyicileri ve uygulamaların tamamı olmasa dahi bir kısmını MicroPython çalıştıran başka donanımlarda uygulama imkanına sahipsiniz. İsterseniz şu [10] [11] bağlantılardan daha açıklayıcı bir diyagrama erişebilirsiniz.

Biraz daha araştırma yaptığımızda kullandığımız kartın üreticinin resmi geliştirme kartlarından biri olan ESP32_DevKitC kartının neredeyse birebir kopyası olduğunu görmekteyiz. Bu kartın pin diyagramları ise resimdeki gibidir.

Beğendiğiniz bir diyagramı yazıcıdan çıktı alıp göz önünde bir yere yerleştirmeniz işinizi kolaylaştıracaktır.

Kullandığımız kartın üzerinde ayak isimleri yazmadığı için sürekli bu şemalara bakıp tek tek sayarak doğru ayağı bulmak bizim için zor olabilir. Bu yüzden Fritzing forumunda steelgoose kullanıcısı tarafından tasarlanan şemayı yazıcıdan çıkarıp resimdeki gibi breadboard üzerine yerleştirebilirsiniz.

Kartı kullanmadan önce bilmeniz gereken bazı kısıtlamalar mevcuttur. Bunları göz önünde bulundurarak program geliştirmeniz gereklidir. NodeMCU kartında yer alan bazı ayaklar modüldeki Flash hafıza tarafından kullanılmaktadır. Bunların hiçbir amaç için kullanılmaması gereklidir. Diyagramda belirtilen GPIO9–11 arası ayaklar Flash hafıza tarafından kullanılmaktadır. Bu yüzden bazı kartlarda bu ayaklar yer almamaktadır.

GPIO36, GPIO39, GPIO34 ve GPIO35 ayakları sadece giriş olarak kullanılabilir.

GPIO1 (TX0) ve GPIO3 (RX0) ayakları UART ile USB iletişimini sağlamaktadır. Bunlar kullanılırsa seri port üzerinden program yükleme ve seri port ekranını kullanma şansımız kalmaz. O yüzden kesinlikle olağan şartlar altında programlanmamalıdır.

GPIO0, GPIO2, GPIO12(MTDI) ve GPIO15(MTDO) ayakları strapping bitleridir. O yüzden pull-up ve pull-down eklerken dikkat etmek gereklidir. Mümkün mertebe çıkış olarak kullanılmalıdır. Kullanmanız gerektiğinde şu kuralları gözetmelisiniz.

· GPIO0: Boot esnasında HIGH programlama sırasında LOW olmalıdır.
· GPIO2: Boot esnasında LOW olmalıdır. Kart üzerindeki LED’e bağlıdır.
· GPIO12: Boot esnasında LOW olmalıdır.
· GPIO15: Boot sırasında HIGH olmalıdır.

Açılış esnasında bazı ayaklar kısa bir süreliğine tekrarlayan 1 ve 0 sinyalleri göndermektedir. Bunu anahtarlama elemanlarına bağladığınızda istenmeyen durumlarla karşılaşabilirsiniz. Bu ayaklar şu şekildedir.

· GPIO1: ESP32 boot kayıtlarını UART üzerinden yollar
· GPIO3: Açılışta 3.3V
· GPIO5: Açılışta PWM sinyali gönderir.
· GPIO14: Açılışta PWM sinyali gönderir.
· GPIO15: ESP32 boot kayıtlarını UART üzerinden gönderir.

Özetle, kullanmamanız gereken ayaklar şunlardır;

· GPIO9
· GPIO10
· GPIO11
· GPIO8
· GPIO7
· GPIO6
· GPIO1
· GPIO3

Herhangi bir şart olmadan kullanabileceğiniz ayaklar şunlardır;

· GPIO2
· GPIO4
· GPIO5
· GPIO13
· GPIO16
· GPIO17
· GPIO18
· GPIO19
· GPIO21
· GPIO22
· GPIO23
· GPIO25
· GPIO26
· GPIO27
· GPIO32
· GPIO33

Başlangıç için kart ve modül hakkında bilmeniz gereken bilgiler bu kadarıyla yeterlidir.

ESP32 Yazılım Geliştirme Ortamları

Teknik veri kitapçıkları ürün hakkında donanım ağırlıklı genel bilgiyi içerirken referans kılavuzları çevre birimlerini, yazmaçları (register) ve programlamada bize gerekli olan diğer bilgileri içermektedir. Referans kılavuzunu aşağıdan indirebilirsiniz.

https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf

Bunun yanında üreticiler donanım tasarım rehberi de yayınlamaktadır. Bu mikrodenetleyiciyi yonga şeklinde alıp kendimiz bir kart tasarlamak istiyorsak bundan faydalanabiliriz.

https://www.espressif.com/sites/default/files/documentation/esp32_hardware_design_guidelines_en.pdf

Gömülü sistem geliştirmede en klasik yöntem bu belgeleri okumaktır. Özellikle önceleri pek çok zaman üreticinin verdiği bu tarz belgelerden başka kaynağa sahip olunmazdı. Bu durumda üreticinin sağladığı Assembler ile komut seti kılavuzunu ve assembler kılavuzunu okuyarak teknik referans kılavuzundan öğrenilen bilgilerle gerçek anlamda sıfırdan kod yazmaya başlanılırdı. Burada en zor olan kısım teknik belgelerin açık ve anlaşılır olmaması ve kitaplardaki teorik bilgilerle üreticinin ürettiği teknolojinin anlaşılmaya çalışılmasıdır. Bu durumda birkaç basit örnek olsa bile durumu rahatça anlayıp program yazabilecekken bazen bu örneklere erişmek bile büyük mesele olabilmektedir. C derleyicisine ücretsiz erişme imkânınız olsa da eğer önceden bir yazılım desteği sağlanmamışsa her şeyi yine sıfırdan sizin yazmanız gerekecektir. Espressif bu noktada ESP-IDF adında yazılım geliştirme kitini geliştiricilere sağlamaktadır. Bununla ilgili dokümantasyonu aşağıdan inceleyebilirsiniz.

https://docs.espressif.com/projects/esp-idf/en/release-v4.1/get-started/index.html

ESP8266 ve ESP32’leri Wi-Fi modül olarak haricen de kullanma imkânımız vardır. Böylelikle ESP’ler üzerinde program yazmadan başka bir mikrodenetleyici üzerinden metin şeklinde AT komutları göndererek Bluetooth ve Wi-Fi bağlantısı kurabiliriz. Bu alternatif bir kullanım şekli olup kitabın kapsamı dışında kalmaktadır. [12]

ESP266 ve ESP32 modülleri Arduino başta olmak üzere pek çok geliştirme ortamında geliştirebilir. C/C++, Javascript, Lua, Lisp dillerinin yanı sıra Python dilini de kullanabilirsiniz. İlgili Vikipedi sayfasında ve bir Github deposunda ayrıntılara ulaşabilirsiniz. [13][14]

ESP32’yi programlamak için pek çok alternatifimiz olsa da biz sadece Python dilini kullanmak istediğimiz için MicroPython’u kullanacağız. MicroPython’un diğerlerine kıyasla oldukça pratik ve etkili olduğunu ve ESP-IDF ile beraber en uygun seçeneklerden biri olduğunu söyleyebilirim.

Bir sonraki bölümde gerekli kurulum işlemlerini yapıp MicroPython ve ESP32 ile uygulamalar yapmaya başlayacağız.

1. Bölüm Kaynakça

[1] https://en.wikipedia.org/wiki/PIC_microcontrollers#/media/File:PIC16CxxxWIN.JPG

[2] https://www.maximintegrated.com/en/products/microcontrollers/MAXQ305.html

[3] HC-IO kısmına bakınız. https://ww1.microchip.com/downloads/en/DeviceDoc/30009630M.pdf

[4] https://www.allaboutcircuits.com/textbook/digital/chpt-3/logic-signal-voltage-levels/

[5] https://www.st.com/resource/en/application_note/an4899-stm32-microcontroller-gpio-hardware-settings-and-lowpower-consumption-stmicroelectronics.pdf

[6] https://datasheets.maximintegrated.com/en/ds/MAX260-MAX262.pdf

[7] https://www.analog.com/media/en/technical-documentation/data-sheets/ad9833.pdf

[8] https://www.quora.com/How-many-computers-are-in-the-average-modern-car

[9] https://www.maximintegrated.com/en/products/microcontrollers/MAX78000.html

[10] https://cdn.shopify.com/s/files/1/0609/6011/2892/files/doc-esp32-pinout-reference-wroom-devkit.png

[11] https://lastminuteengineers.com/esp32-pinout-reference/

[12] https://docs.espressif.com/projects/esp-at/en/latest/esp32/Get_Started/What_is_ESP-AT.html

[13] https://en.wikipedia.org/wiki/ESP8266

[14] https://github.com/agucova/awesome-esp

--

--