Projelerin çoğunda sistemimiz kullanıcısından bilgi girişi ya da bazı seçimler yapmasını ister. Bunu teknik adı ile “İnsan Makina Arayüzü – Human Machine Interface HMI” olarak andığımız sistem bölümleri üzerinden yaparız.
HMI dediğimiz, modern cihazların albenisini ve kullanışlılığını belirleyen önemli bir unsurdur. Basit bir tuş takımı ile, bazı LED lerle geri bildirim yapan HMI larla başlayıp, gayet şık dokunmatik, animasyonlu grafik ekranlara kadar geniş bir yelpaze söz konusu.
Bu iş için MCU tedarikçilerinin sunduğu çok yetenekli kütüphaneler var. Embedded Wizard gibi üçüncü parti geliştirme araçları da var. Bunların ücretsiz sürümleri ile bile dünyanın işini yapabiliyorsunuz. Ancak bu kütüphanelerin -en azından benim karşıma çıkanları- hep üst kategorideki yüksek kapasiteli mikro kontrolcülere yönelik, kapasite arsızı canavarlar.
Ben, mütevazi seviyedeki işlemciler ile kullanabileceğim bir kütüphane oluşturdum. Bunu CNC geliştirme çalışmalarımda karşılaştığım ihtiyaçları dikkate alarak yaptım. Gayet de tatminkar olduğunu düşündüğüm bir paket ortaya çıktı.
Bu yayının konusu bu; Selçuk Özbayraktar yapımı LwGui sistemi.
Aslında genelde işimizi görmek için çok alengirli, fazla renkli animasyonlara ihtiyacımız yok. Her hangi bir kullanıcı girişi gerektiğinde düğme sayısı o duruma uygun olarak ayarlanabilsin, düğme etiketleri duruma göre değiştirilebilsin, animasyon olarak da tıklanan düğme çöküp çıksın ki algılandığını anlayalım yeter.
Dokunmatik ekranlarla çok daha esnek çalışabiliyoruz. Uygulamamız aynı zamanda 4×4 gibi mekanik bir telefon tuş takımı ile de çalışsın istersek daha sade seçeneklere yönelmek gerekiyor.
Bu yayında TFT ekranda bir “drop down list” menü yaratan bir örneği ele alacağım. 4×4 tuş takımında basılan tuşa karşılık ekrandaki bir düğmeyi indirip çıkaran uygulama üzerinden. Aslında paketim tek seferde anlatamayacağım kadar kapsamlı.
Dokunmatik ekran kullanıldığında ekrandan direkt giriş yapılmasını sağlayan fonksiyonlarım da var.
Ama, yayınları çok kapsamlı tutunca iş gözümde büyümeye başlıyor. Bu nedenle azcık azcık ilerleyelim. Hani “bir fili nasıl yersiniz?” sorusunun yanıtı gibi.
Aşağıdaki drop down menü ekranı aslında CNC de dosya seçimi için kullanıyorum. Ama bu örnekte, görüntülenmek istenen .bmp dosyasının seçimi için kullanacağım.
Burada 1 kolon 11 satırlık bir tuş takımı var. Kite bağlı mekanik klavye tuşlandığında fonksiyonumuz basılan tuşa karşı düşen düğmeyi indirip kadırıyor. Bu şekilde girişin algılandığını görsel olarak bildiriyor, ardından da tuşun ASCII değerini geri gönderiyor.
Eğer ekranımız dokunmatik ise, o zaman 4×4 tuş takımı gibi bir sınırlama da ortadan kalkıyor. İsterse ekranda 20×8 ilk bir klavye olsun, giriş yapabiliyoruz.
YÜKTE HAFİF GRAFİK HMI – LwGUI (Light Weight Graphical User Interface)
O halde bizim ekran üzerinde esnek olarak boyutlandırılabilen, tuşlarının üzerindeki semboller istendiği gibi seçilebilen tuş takımlarına ihtiyacımız var.
Bu paketime “Light Weight Graphical User Interface LwGui” adını verdim. İleride yapacağım eklemelerle, “balık eti GUI” , “Şişman GUI” ve “Obez GUI” sürümlerini de ortaya koyabilirim.
Şimdilik aşağıdaki gibi bir veri yapısı yeterli oluyor :
Yapı aslında çok karmaşık değil. Temel parametreler, tuş takımımızın satır sütun sayıları, ekranın neresinde yer alacağı ve buton etiketlerinin bmp dosyası içindeki offset değeri.
Diğer parametreler tuşlar arasındaki aralıklar ve dokunmatik ekranlarda tuşun ne kadar ortasına dokunursak geçerli kabul edileceğini belirleyen detay parametreler.
Sanırım fonksiyonun çalışmasını içine koyduğum notlarla yeteri kadar anlatmışım zaten.
Her bir farklı tuş takımı kombinasyonu için bunun benzeri bir başka fonksiyon gerekiyor. Bu fonksiyonların çoğu sadece basılan tuşun ASCII değerini geri göndermekle kalmıyor, basılan tuşa bağlı olarak bir sürü görevi yerine getiriyorlar. Bu yayında onları tek tek anlatmayacağım.
GEREKEN DOSYALAR
Sadece tuş etiketlerini oluşturan BitMap leri içeren dosyalar hakkında birşeyler söylemek gerekiyor. Önce STM32 CubeIDE project explorer de bu iş ile ilgili dosyaların bir görüntüsünü vereyim:
Burada LwGui ile ilgili dosya ve fonksiyonlar LwGui klasörü içinde yer alıyor. CNCcommon.h da da birkaç genel kullanımlı değişken bildirimi var.
TUŞ ETİKETLERİ İÇİN BMP MATRİKS VERİLERİ
Bu dosyalardan LwGuiBmp.h adlı olanında tuşların üzerinde koymak isteyebileceğimiz etiketlerin 16×8 BitMap monokrom verileri var. Aynen font dosyaları gibi.
Bunların hazırlanması zahmetli bir iş, tek seferde olmuyor, zaman içinde eklenenlerle zenginleşen bir dosya. Bunları hazırlamak için bir excel makro dosyam var.
Bunlardan seçtiklerimizi istediğimiz butonların üstlerine yazıyoruz. Yazma fonksiyonumun ölçeklendirme yeteneği (scaling) olduğundan iki katı, üç katı, dört kat büyüklüklerde yazma olanağım da var.
Program akışı içinde bu bmp sembol satırlarına kolayca ulaşabilmek için bunların indekslerini veren dosyalarım da LwGuiButtonBmps.h içeriğinde. Aşağıdaki gibi, sembolün isminden hareketle bmpFile[] içindeki indeksine ulaşabiliyoruz. Sembol isimlerinin yeterince açık ve anlamlı olmasına çalıştım :
ve devamı:
TUŞ TAKIMI ETİKETLEMELERİ
Program akışı içinde çeşit çeşit tuş takımlarına ihtiyaç oluyor, her birinin tuş sayısı ve tuşları üzerindeki etiketler farklı farklı. Bunlar LwGuiButtonBmps.h dosyası içinde labelList[] dizininde aşağıdaki gibi yer alıyor:
DROP DOWN MENU İÇİN BİR ÖRNEK – CNC MOTOR ADIM BOYUTU SEÇİMİ
PARAMETRE GİRİŞ TUŞ TAKIMI
Bu çok kullanılan bir tuş takımı tipi. Birkaç parametre için sayısal değerler girilmesi gerektiğinde kullanıyoruz. Bu örnekte CNC de silindirik bir oyuğun iç ve dış çapları ile derinliğinin girilmesi için bir tuş takımı var.
JOY STICK MANUEL HAREKET PANELİ
Bu da CNC uygulamasına ait bir başka tuş takımı ekranı. Ekran dokunmatik ise doğrudan tuşlara dokunarak, yok eğer mekanik tuş takımı var ise 4×4 klavye butonlarına basılarak kullanılıyor.
CNC KÜTÜPHANE FONKSİYONU SEÇİMİ MENÜSÜ
Bu menü de 2×4 boyutunda bir tuş takımına örnek. Bu durumda 4×4 tuş takımımızın üst iki satırını kullanıyoruz. Burada çember, dikdörtgen, altı köşe vida başı, delik delme ve encoder disk üreten CNC kütüphane fonksiyonlarından biri seçilebiliyor.