2.4″ TFT EKRANIN DOKUNMATİK SENSÖR PİNLERİNİN BULUNMASI
(ARDUINO KULLANMAYANLAR İÇİN, ÖZELLİKLE STM32F103 İÇİN)
Çinliler sağ olsunlar elektronik malzemeleri çok ucuza satıyorlar ama satış personelleri teknik açıdan sattıklarının ne olduğundan bihaberler. Hiçbir teknik destek alamıyorsunuz.
TFT ekranlarda durum farklı değil. Bu ekranın arkasına baktığınızda da dokunmatik sensörlerin hangi pinlere bağlı olduğuna dair hiç bir işaret yok. Verdikleri dokümanlar ve yazılım örnekleri de sadece Arduino kullanıcılarına yönelik. Onlar da tak-çalıştır parçalara alışık olduklarından bu ayrıntılarla hiç ilgilenmiyorlar.
Satıcı sitesinden destek istediğimde STM32 için de bir örnek kod paketi verdiler ama o da SPI arayüzlü TFT lere yönelik çıktı. Yani o dokümanlardan da hayır yok. Sonuçta kendi göbeğinizi kesmek zorunda kalıyorsunuz. Ben de öyle yaptım, aşağıda anlattığım gibi.
Dokunmatik ekranı kullanabilmek için herşeyden önce sensör dirençlerinin uçlarına erişmek gerekiyor. Dokunmatik panel filminin direnç uçlarının bağlandığı pinlerin bir standardı olmadığından -öyle sanıyorum- bir başka tedarikçiden alınacak ekranın pinleri farklı olabilir. Bu nedenle bu pinleri nasıl belirlediğimi ve nasıl kullandığımı da anlatmakta yarar var.
Önce bir uyarı: Bu ekranların SPI arayüzlü olanları da var, burada ele aldığım 8 bit paralel arayüzlü olan bir model. Bunlar SPI arayüzlü olanlara göre biraz daha ucuz oluyorlar hem de daha hızlılar. Ancak, SPI bağlantıya göre daha fazla I/O pin kullanıyorsunuz. Mikro işlemcinizde I/O sayısı kısıtlı ise sıkıntı olabilir.
SPI arayüz dokunmatik ekrana erişim konusunda da karşınıza çıkabilir. Zira bazı ekran modellerinde dokunmatik sensörlere de burada anlattığım gibi direkt değil SPI üzerinden erişiliyor.
Uzun lafın kısası, burada anlattıklarım 8 bit paralel girişli, dokunmatik sensörlere erişimin de doğrudan olduğu TFT TP modelleri için geçerli. SPI arayüzlü olanlar için değil.
DOKUNMATİK DİRENÇ UÇLARININ BELİRLENMESİ
Dokunmatik filmin X ekseni direncinin ve Y ekseni direncinin ikişer ucu TFT nin 4 adet pinine bağlı. Bu pinleri TFT ile ortak kullanıyor. Bu dirençlerin herbiri 300-700 Ohm arasında bir değerde. Ekrana dokunulduğunda X ve Y dirençleri orta uçlarından birbirine bağlanmış birer potansiyometre haline geliyor. Bu durumda X ekseni direncinin pinlerini Y potansiyometresinin orta ucuna erişmek için, Y ekseni pinlerini de X potansiyometresinin orta ucuna erişmek için kullanıyoruz.
Pinleri nasıl belirlediğime gelince, TFT nin her bir pini ile diğerler pinler arasındaki dirençleri bir multimetre ile ölçerek kontrol ediyoruz. X ve Y Touch Panel dirençleri dışındaki pinlerde bu ölçüm megaohmlar mertebesinde oluyor. Doğru uçları bulduğumuzda ise 300-700 Ohm arası bir değer okuyoruz.
Gördüğüm kadarı ile, Arduino uyumlu diye satılan ekranlarda bu dirençlerin bir ucu TFT digital kontrol pinlerinde (CS,RS,WR,RD), diğer uçları da D0..D7 pinlerinde oluyor. Bu ikinci grup pinler analog giriş görevlerini de üstelenebildiklerinden böyle bir seçim yapmışlar. Zira Arduino dünyasında “Digital Input” ve “Analog Input” diye bir gruplama var. Aşağıda tarif ettiğim yöntemde bazı pinlerde analog ölçümler yapmamız gerektiğini göreceğiz.
SENSÖR PİNLERİNE ULAŞTIK, ŞİMDİ SIRA DOKUNULAN NOKTANIN BELİRLENMESİNDE
Bu konuda tedarikçi’nin STM32 için verdiği kod örneğinden yararlandım. Aynen kullanamasam da, mantığından yararlanarak kendi kodumu yazdım.
(Yazılım kodunu blog içinde vermiyorum, ama ilgilenen olursa gitHub üzerinden paylaşabilirim.)
Yazılımımız için, pinleri belirlemenin ötesinde, dokunulan noktaya bağlı olan direnç değerlerini (daha doğrusu X ve Y potansiyometrelerimiz gerilim bölücü olarak çalıştığından gerilim değerlerini) de bilmemiz gerekir. Dokunulan noktanın pozisyonunu buna göre belirleyeceğiz, yazılımımıza bir de kalibrasyon prosedürü eklemek gerekebilir.
Bunun için X direncinin bir ucunu GND, diğer ucunu Vcc ye, Y direncinin bir ucunu da Vcc ye bağlıyoruz. Y Direncinin diğer ucundaki gerilimi multimetre ile ölçülecek. Ekrana dokunulmadığında Vcc değerini göreceğiz, ekrana dokunulduğunda da dokunulan noktaya göre değişen gerilim değerleri okunur. Buradan pixel başına Volt olarak kalibrasyon değeri hesaplanabilir, bu esnada minimum değere karşı düşen bir offset parametresi de eklemek gerekir. Bu değerleri yazılımımıza default değer olarak girip, farklı ekranlar kullanıldığında aynı işi programımız içindeki bir fonksiyon ile de tekrarlatmamız gerekir. (ekranın 4 köşesini gezen bir markere tıklatmak suretiyle.) Genelde bu değerleri bir EEPROM’a kaydederek saklıyorlar, ama ben bu kayıt adımını boş geçtim.
2.4″ ekranın yaklaşık 1/4 üne çizdiğim 4×4 tuş takımına kalemle dokunarak gayet iyi sonuç alabiliyorum. Ekranın tepesine koyduğum 10 pixel genişliğindeki menü satırı ve benzeri drop down menülerde iyi sonuç veriyor. 2 satır x 16 ya da 4 satır x 20 LCD displayler yerine bu TFT leri kullanılabiliyor. Tuş takımından kurtulabiliyoruz, daha da ucuza geliyor. Yalnız program kodu 32kB nın üzerine çıkabiliyor, o zaman bedava KEIL sürümü sıkıntı yaratıyor. Neyse ki şimdilerde ST nin ücretsiz verdiği bir geliştirme platformu var.
Önemli uyarı : Bu ekranlar alfanümerik LCD lere göre bayağı yavaş çalışıyor, hızın kritik olduğu durumlarda dikkatli olmak gerekiyor. Hızları da ölçtüm, bir ara kayıtları elime geçtiğinde paylaşırım. (Paylaştım, buraya tıklayınız.)
Kullandığım 2.4″ TP TFT yi BangGood dan almıştım. Kullandığım mikroişlemci de STM32F103. Benim kullandığım pinler aşağıdaki gibi:
2.4″ 8 bit paralel girişli TFT Data girisleri
8 Paralel giris:
- TFT_P_D0 TPY+ PB8 (Touch panel ortak pini)
- TFT_P_D1 TPX+ PB9 (Touch panel ortak pini)
- TFT_P_D2 PB10
- TFT_P_D3 PB11
- TFT_P_D4 PB12
- TFT_P_D5 PB13
- TFT_P_D6 PB14
- TFT_P_D7 PB15
ILI9341 2.4″ 8 bit paralel girişli TFT ekranın TP ve kontrol pinleri
- TFT_P_RST >>3V3 Aslında STM32 nin RST pini ile ortak sürülebilir.
- TFT_P_D1 TPX+ >> PB9 (Her zaman digital output, TP_X ölçümü için 1 (Vcc) uygulanıyor)
- TFT_P_D0 TPY+ >>PB8 (Her zaman Digital Output, TP_Y ölçümü için 1 (Vcc) uygulanıyor)
- TFT_P_CS TPX_M >>PA1 (TP_Y ölçümü için ADC1 girişi TPX ölçümü için ise “0” uygulaniyor)
- TFT_P_RS TPY_M >>PA0 (TP_X ölçümü için ADC2 girişi, TPY ölçümü için ise “0” uygulanıyor)
- TFT_P_WR >>PB1
- TFT_P_RD >>PA4