Elektronik / Mikrodenetleyici Projeleri/

PIC ile dokunmatik panel grafik lcd kullanımı mikro c

Dokunmatik özellikli grafik lcd uygulaması için iyi bir örnek picroje forumunda paylaşımı yapan “”f_machine”” adlı üyeye teşekkürler

PIC ile DOKUNMATİK PANEL KONTROLÜ (Pic 18F4620)

dokunmatik-panel-128x64-grafik-lcd
Resim 1-Dokunmatik Panel ve 128*64 Grafik LCD

Bu yazıda,4 kablolu rezistif dokunmatik panel incelenecektir. Dokunmatik panel, dokunduğumuz noktaya uygun olarak bize analog çıkışlar üretir. Dokunmatik panelin alt ve üst tarafında iki film bulunur. (Şekil 1) Panele dokunduğumuzda, bu iki film birbirine temas eder.İki film arasında akım akışı olur. X koordinatını elde etmek için üst taraftaki film, Y koordinatını elde etmek için ise alt taraftaki film enerjilendirilir.Diğerinden adc ile değer okunur. Dokunduğumuz konumu tespit etmek için 2 adım izlenir.

1. Y uçlarından birine +5v,diğerine 0v verilir.X uçlarından biri yüksek empedans(hi-z) yapılır. X in diğer bacağından adc ile analog değer okunur.Okunan değer Y koordinatıdır.

2. X uçlarından birine +5v,diğerine 0v verilir.Y uçlarından biri yüksek empedans(hi-z) yapılır. Y nin diğer bacağından adc ile analog değer okunur.Okunan değer X koordinatıdır.

dokunmatik-panel-glcd-alt-ust-filmler
Şekil 1- Dokunmatik Panel Alt ve Üst Filmler

Ancak dokunmatik panel,biz panele dokunmasak dahi,bir çıkış üretir. Bu da yanlış ölçümlere sebep olur.Bunu engellemek için ise,ölçümden önce; X uçlarından birine +5v verilir,diğeri analog giriş yapılır..Y uçlarından biri yüksek empedans(hi-z) yapılır.Y nin diğer bacağından adc ile analog değer okunur.

Okunan değerVcc ye yakın bir değerse, panele dokunulmuş demektir.Daha sonra yukarıdaki 1. ve 2. adımlar takip edilerek X ve Y koordinatları belirlenir. Panelin, basılan örnek beş noktası (Şekil 2) ve bunlara verdiği X çıkışları(Şekil 3) aşağıda gösterilmiştir.

xelectrode-glcd-panel-cilis
Şekil 2- Örnek Beş Nokta

dokunmatik-panel-bitlik-adc-sonuclari
Şekil 3- 10 Bitlik Adc Sonuçları

Ayrıca,paneli kontrol etmek için bir sürücü devre kullanmak gerekir.(Şekil 4) Sürücü devredeki AN0 ve AN1 bacakları pic’in RA0 ve RA1 analog girişlerine bağlanır. Diğer 2 pin PORTA nın 2. ve 5. pinlerine bağlanır.

dokunmatik-panel-128x64-grafik-lcd-surucu-devre
Şekil 4- Sürücü Devre (transistörler BC556AP)

Şimdi konuyu daha iyi anlamak için bir örnek uygulama yapılacaktır. Program MikroC ile yazılmıştır.

//dokunmatik_deneme.c
//yazar: Serdar Güney
//pamukkale üniversitesi elektrik-elektronik mühendisliği
//Program dokunmatik panelin ürettiği analog çıkışı glcd de gösterir..
//29.04.2009

unsigned int x_koordinat(void );
unsigned int y_koordinat(void );
unsigned char basma_kontrol(void );
unsigned int adc_deger;
unsigned char ch;
long gerilim;
void main () {
ADCON1=0x0D; 			//RA0,RA1 ANALOG, GERİSİ DİJİTAL
PORTA = 0x00;
TRISA = 0x03; 			// PORTA.0 ve PORTA.1 giriş
PORTA=0x00;

Delay_Ms(100);

Glcd_Init(&PORTB,1,0,2,3,4,5, &PORTD); 	//glcd pinleri ayarla
Glcd_Set_Font(FontSystem5x8, 5, 8, 32);
Glcd_Fill(0x00); 						//glcd temizle
Glcd_Write_Text("X= ",10,3,1);
Glcd_Write_Text("Y= ",10,5,1);
for (;;) {

while (!basma_kontrol()); 				//panele dokunuldu mu?
gerilim = (long)x_koordinat() * 5000; 	// okunan değeri mv a dönüştür
gerilim = gerilim / 1023;				 // 0..1023 -> 0-5000mV
ch = gerilim / 1000; 					// voltu elde et
Glcd_Write_Char(48+ch,42,3,1); 			// voltu yazdır
Glcd_Write_Char('.',50,3,1);
ch = (gerilim / 100) % 10; 				// 0.1 volt değerlerini elde et
Glcd_Write_Char(48+ch,58,3,1);
ch = (gerilim / 10) % 10; 				// 0.01 volt değerlerini elde et
Glcd_Write_Char(48+ch,66,3,1);
ch = gerilim % 10; 						// 0.001 volt değerlerini elde et
Glcd_Write_Char(48+ch,74,3,1);
Glcd_Write_Char('V',82,3,1);

					//y koordinatı için aynı işlemleri tekrarla

gerilim = (long)y_koordinat() * 5000;
gerilim = gerilim / 1023;
ch = gerilim / 1000;
Glcd_Write_Char(48+ch,42,5,1);
Glcd_Write_Char('.',50,5,1);
ch = (gerilim / 100) % 10;
Glcd_Write_Char(48+ch,58,5,1);
ch = (gerilim / 10) % 10;
Glcd_Write_Char(48+ch,66,5,1);
ch = gerilim % 10;
Glcd_Write_Char(48+ch,74,5,1);
Glcd_Write_Char('V',82,5,1);

Delay_Ms(5);
}
}
unsigned int x_koordinat() {
unsigned int sonuc;
TRISA.F0=0; 				// porta 0. bit çıkış
PORTA=0; 					//porta yı temizle
PORTA.F2=1; 				// Y+ yüksek empedans
PORTA.F5 = 0; 				// X+ +5v
Delay_Ms(5);
sonuc=adc_read(1); 			// X koordinatını al
TRISA.F0=1; 				//porta 0.bit analog giriş
return sonuc;
}

unsigned int y_koordinat() {
unsigned int sonuc;
TRISA.F1=0; 				//porta 1.bit çıkış
PORTA=0; 					//porta yı temizle
PORTA.F2 = 0; 				// Y+ +5v
PORTA.F5 = 1; 				// X+ yüksek empedans
Delay_Ms(5);
sonuc = adc_read(0); 		// Y koordinatını al
TRISA.F1=1;
return sonuc;
}
unsigned char basma_kontrol(void ) {
unsigned int ADC_ESIK_DEGER=800;		 //esik deger (5V/1024)*(800)=3.9v

unsigned char sonuc;
TRISA.F1=1; // RA0 analog giriş
TRISA.F0=1; //RA1 analog giriş
PORTA=0; //portayı temizle
PORTA.F2=0; // Y+ +5v
PORTA.F5=1; //X+ yüksek empedans
adc_deger=adc_read(0); // y koordinatını al
sonuc = (adc_deger > ADC_ESIK_DEGER); 			// okunan değer eşik değerden büyükse sonuc=1
Delay_Ms(2);
adc_deger = adc_read(0); 					// hata olasılığı için işlemi tekrarla
sonuc = sonuc & (adc_deger > ADC_ESIK_DEGER);
return sonuc; 							//basıldıysa 1,basılmadıysa 0 olur
}

Uygulamaya Ait Fotoğraflar

dokunmatik-panel-128x64-grafik-lcd-uygulama1 dokunmatik-panel-128x64-grafik-lcd-uygulama2

  1. Ö.Değer ÖZSU 2009/06/14
  2. ahmet 2009/06/20
  3. ahmet 2009/06/20
  4. Kaan 2009/07/21
  5. evliya songül 2009/07/27
  6. Bahadır 2010/02/11
  7. alper 2011/03/02
    • murat 2013/04/10
  8. ilker 2011/06/12
  9. bulent 2013/05/06
  10. CodeRun 2013/08/20
  11. ruzgar_2626 2014/01/07

Yorum

Soru: