STM32 ile STONE LCD Kullanımı

Merhabalar,

Bu konuda daha önceden Arduino ile kullanımını anlattığımız STONE marka LCD’ lerin STM32 serisi kartlar ile nasıl kullanacağımıza değineceğiz. Ancak bu yazıda Nextion ekran’ da kullanırken yaptığımızdan farklı olarak STM32CubeMx kullanacağız. Arduino ile kullanım için yazdığım yazıda editörün kullanımına detaylıca yer vermeye çalıştım. O yüzden bu konuda da aynı şekilde detay vermeyeceğim. Önceki yazıya bağlantıdan ulaşabilirsiniz. Sadece bu uygulamada ek olarak önceki tasarıma slider ekledim. Bu slider’ in editor’ a nasıl eklendiğine ve ayarlarının nasıl yapıldığını göstereceğim. İkinci olarak da daha önceden de belirttiğim gibi elimdeki ekran RS232 kullanarak diğer cihazlar ile haberleşmekte. Elimde RS232′ den UART’ a dönüştüre bir donanım olmadığı için önceki yazıda transistörlü bir çözüm yapmıştım. Şu an elimde MAX232 entegresi bulunduğu için bu yazıda MAX232 kullanırken oluşturmanız gereken devreden de bahsetmeye çalışacağım. 

Öncelikle devreden başlayalım. Devrenin fritzing çizimi aşağıdaki gibidir. Çizimde sağ tarafta bulunan kısım RS232′ yi UART’ a çevirmek için gerekli devredir. Bu devrede kondasantörleri kutuplu kullanacaksanız yönlerine dikkat etmelisiniz. Değeri 1uF ile 100nF  arası değerler seçebilirsiniz. Bu devrede tam anlayamazsanız internetten “MAX232 TTL circuit” yazarak farklı şematiklere bakabilirsiniz. MAX232 entegresi üzerinde iki adet dönüştürücü bulunmakta. Yani Bir MAX232 entegresi ile 2 farklı RS232 veri hattını UART’ a çevirebilirsiniz. Ben 1 tanesine ihtiyaç duyduğum için bu pinleri kullandım. İnternette farklı pinlerde kullanan şematiklerde görebilirsiniz. 

image

Devrede MAX232 entegresinin yanı sıra 4 adet LED ve bir de potansiyometre bulunmakta. Bu elemanlar diğer konuda da olduğu gibi ekran üzerindeki araçlar kullanımını göstermek için devreye eklenmiştir. 3 LED butonlara basıldığına yanması,  potansiyomtre ekran üzerindeki göstergenin değerini değiştirmek içindir. 4. ve en soldaki LED ise eklediğimiz slider’ ın değeri değişince parlaklığı değiştirilebilmesi için PWM pinine bağlanmıştır.

Devreyi oluşturduktan sonra ekran tasarımına sıra geldi. Ekran tasarımı olarak önceki tasarımın aynısını kullandım. Sadece 4. bir sayfa oluşturup slider ekledim. Bu sebeple sadece slider’ ın nasıl kullanıldığını anlatacağım. 4. sayfa olarak freepik üzerinden bir slider tasarımı alıp Photoshop yardımı ile arka plan üzerine slider’ ı ekledim. Slider’ da arka plan olduğu gibi bir de imleç olmalı. İmleci ayrı olarak bitmap’ a çevirip icon olarak eklemek gerekiyor. Bu noktada yine önceki konuda da anlatıldığı üzere icon’ u transparan olmasını istiyorsanız bitmap’ ın arka plan rengini siyah yapmalısınız. Aşağıdaki resimde 4. sayfanın görüntüsü görünmektedir. Slider eklemek için 2 adet araç kullanmak gerekli. Bu araçlar aşağıdaki resimde kırmızı ile işaretlenmiştir. Araçlardan bir tanesi slider iconunu hareket edeceği alanı belirlemek, diğeri ise dokunma etkinliğini yakalanacağı alanı belirlemek içindir. Bu iki araç da aynı amaca hizmet ettiğinden hafıza adreslerini aynı belirlemek gereklidir.

slider_stone2

 Yukarıdaki resimde mavi ile seçili kısımda da görüldüğü üzere slider’ da kullanılması için bir icon ekledim. Bu icon “Slider Scale” aracında kullanılacaktır. “Drag adjustment” isimli araç ise kaydırma alanını belirleyen araçtır. Bu araçların ayarları aşağıdaki resimde mevcuttur. Sayfaya ek olarak slider’ ın değerini görebilmek için “Data Variable” aracı ekledim. Yukarıda da belirttiğim gibi aynı amaç için kullanılan araçların adresleri de aynı olmalıdır. Bu sebeple araçların özellikleri ayarlanırken 3 aracın da adreslerini aynı koymalısınız. Ben bu adresi 4001 olarak belirledim. Adresin hexadecimal formatta olduğunu unutmayın. 

slider_sett_stone

Ekranda slider için yaptığımız ayarlar bittiğine göre slider’ ın değerini değişince nasıl bir veri göndereceğine bakalım. Aslında slider’ ın gönderdiği veri formatı ile button arasında hiç fark yok. Daha önceki konuda buton için kullandığımız veri ayırma yönteminin aynısını kullanacağız. Sadece buton yerine slider kullandığımız için gelen verinin adresi farklı olacaktır. Bu adrese bakarak yapmak istediğiniz işlemi bir sorgu ile yapmalısınız. Ekran üzerindeki slider’ ı kullandığımızda gelen veri formatı aşağıdaki gibi olacaktır.

Header1, Header2, Paket uzunluğu, Veri Tipi, Adres 1, Adres 2, Veri Uzunluğu, Veri1, Veri2 ]

Bu formata dikkat edecek olursanız diğer konuda buton için verdiğim format ile aynı. Burada Adres1 ve Adres2 değerlerine bakarak gelen verinin slider olduğuna karar veren bir yazılım oluşturmalıyız. UART arayüzlü ekranlar ile STM32 kullanmanın güzel bir yanı da STM32′ de UART için kesmesinin bulunmasıdır. Bu sayede mikrodenetleyici yaptığı işi bırakıp kesme fonksiyonuna gidecek bu sayede özellikle hızlı veri akışı gereken durumlarda veri kaçırma ihtimali çok azalacaktır. Şimdi CubeMX’ de yapılması gereken ayarlara bakalım. Ben işlemci olarak STM32F103C8T6 kullanacağım. Siz elinizdeki işlemciye göre CubeMX’ i özelleştirebilirsiniz. Aşağıdaki resimde STM32F103 işlemcisi için CubeMX’ de yaptığım ayarlar görülmektedir. Burada bazı kısımlara dikkat etmeniz gerekmektedir. Bunlardan ilki UART baud 115200 ve Global interrupt’ u aktif edilmiş durumdadır. Diğeri ise Timer3′ un prescaler ve counter period ayarıdır. Bu ayarlar ile PWM’ in frekansı ayarlanmaktadır. Ben PWM frekansının 1Khz olmasını istediğim için bu ayarları bu şekilde girdim. Counter Period’ un 999 olması max PWM değerimiz 999 olabilir anlamına gelmektedir. Arduino’ da kullananlar için bu değer en fazla 255 olmuyormuydu diye bir soru işareti olabilir. Bu tamamen Timer ile yapılan ayarlara bağlıdır. Bu durum Arduino için’ de benzerdir.  Aşağıdaki resimlerde işlemci saat ayarı gözükmemekte. İşlemci saati seçilebilecek en yüksek değer 72Mhz olarak ayarlanmıştır. Timer frekansının belirlenmesinde bu frekansın da öenmli olduğunu unutmayınız. 

cubemx_stone

CubeMx’ de ayarları yaptığımız göre sıra geldi yazılım kısmına. Öncelikle UART’ ı interrupt ile nasıl aktif edeceğimize bakalım çünkü bu kısımda önemli bir detay bulunmakta. UART’ ı interrupt modda başlatmak için aşağıda verilen fonksiyonu kullanabilirsiniz. Lakin fonksiyonda da görüldüğü üzere parametre olarak boyut girmeniz gerekmekte. Yani UART’ dan kaç byte geldiğinde bu kesmenin aktif olmasını istiyorsunuz bunu fonksiyona belirtmelisiniz. Bu uygulamada ekranda kullandığımız buton ve slider’ lar için gelen veri uzunluğu değişmediğinden uzunluk parametresi sorun yaratmamaktadır. Ancak uzunluğu değişen paketler olması durumunda UART’ ı interrupt modda bu şekilde kullanamayız.  UART üzerinden gelen veri uzunluğunun değişik olması durumu bu yazının bir konusu değil. Sadece aklına takılanlar için olası iki çözüm önereceğim. Bunlardan ilki HAL kütüphanesini kullanmayıp kesmeyi registerler’ den aktif ettikten sonra UART’ ın IRQHandler’ ini kullanmaktır. Bu ikinci yönteme göre biraz daha zor ama daha profesyonel yöntemdir. İkinci yöntem ise UART’ ı DMA ile kullanmaktır. UART üzerinden gelecek verinin paket boyutundan daha büyük bir DMA buffer’ ı seçip buffer doludğunda bütün buffer’ ı tarayabilirsiniz. İlki yönteme göre daha yavaş ama daha kolay bir çözümdür.

UART’ ı interrupt ile seçtikten sonra uart kesmesi içerisinde yapacaklarımıza bakalım. Daha önceki farkı konularda da belirttiğimiz gibi kesmelerin amacı işlemcinin o anda yaptığı işin bitmesini beklemeden başka bir işin daha öncelikli olarak gerçekleşmesini sağlamaktır. Ancak kesme fonksiyonlarını kullanırken içerisindeki işlemleri olabildiğince hızlı bitirip ana döngüye geri dönmeye çalışan bir yazılım oluşturmalıyız. UART kesmesi içinde yine UART fonksiyonu kullanmak da bazı sorunlara neden olabilir. Bu gibi sebeplere kesmeler içinde olabilidğince az işlem yapılmalıdır. Bende kesme fonksiyonu içerisinde sadece verinin geldiğini ve hazır olduğunu gösteren bayrak değişken kullandım. 

Bu bayrağa bakarak ana döngü içerisinde işlemlerimi gerçekleştirebilirim. Ana döngü içerisinde yaptığım işlemler aşağıda mevcuttur. Burada yine dikkat edilmesi gereken bir püf noktası bulunmakta. İşlemleri bu şekilde gerçekleştirebilmek için ana döngüyü geciktiren (bekleten) herhangi bir yapı kullanmamaya özen göstermeliyiz. Kullanmamız halinde her ne kadar UART kesmesi kullanıyor olsak da gelen verileri ayırma işlemi gecikecektir hatta bekleme süresi uzun ise paket kaçırmaya neden olacaktır. Peki gecikme kullanılması gerekiyorsa o zaman ne olacak. O durumlarda timer kullanmalıyız. Bu yazılımda ben timer yardımı ile bir gecikme oluşturdum ama bunun nasıl çalıştığı hakkında bu konuda detay vermeyeceğim. Gelecek konularda STM32 kullanarak millis fonksiyonu nasıl oluşturulacağı hakkında bir yazı içerisinde detaylıca anlatmaya çalışacağım.     

Yukarıdaki yazılım bloğunda da gördüğünüz üzere gelen veriyi indislerine barak ayırdıktan sonra bir switch  – case yapısı kullanarak gelen adrese göre işlem yaptırdım. Aslında bu kısımlar önceki yazıdan çok farklı değil. Sadece 0x4001 adresinden gelen veri için ayrı bir case oluşturdum. Slider ayarlarına max değeri 100 olacak şekilde ayarladığımız için UART üzerinden gönderilen veri de en fazla 100 olacaktır. Bu sebeple sider’ dan okuduğumuz değeri PWM olarak çıkışa aktarırken 10 ile çarparak gönderiyorum. Yukarıda da belirttiğim gibi PWM’ in en yüksek 999 olarak belirledik. 

ADC okuma işlemini Polling modda gerçekleştirdim. Çok hızlı yada çok fazla sayıda örneğe ihtiyaç duymadığım için tercihimi bu şekilde yaptım. ADC 12 bitlik olduğu için okunan değer de 0 ile 4096 arasında olacaktır. Bu değer ekran üzerindeki gösterge için fazla olduğundan değeri 8′ e bölerek küçülttüm. Böylece okunan ADC değeri 0 ile 512 arasında olmuş oldu. 

Son olarak da göstergenin değerini güncellemeye geldi sıra. İşlemciye UART ile veri gönderme işlemini gecikme kullanmadan yapmak doğru değildir. Çünkü ekran UART’ dan okuduğu veri ile sürekli olarak meşgul olacaktır. Arduino’ da millis kullanarak bu sorunu çözmüştük. Burada da benzeri bir işlem ile sorunu çözebiliriz. Yada bir timer’ ı 100ms’ de bir kesme oluşturacak şekilde ayarlayarak da bu sorunu çözebiliz. Böylece her 100ms’ de bir ekrana veri gönderebiliriz. Ben ilk yöntemi seçtim. 

Bütün ayarlarımızı yaptık ve ekranı kullanmaya hazırız. Oluşturduğumuz yazılımın tamamına bağlantıdan ulaşabilirsiniz.

İyi çalışmalar dilerim…

2 Comments

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir