strona główna
artykuły i recenzje
poradniki
galeria zdjęć
fotoblog

Obsługa rezystancyjnego panelu dotykowego z STM32 (STM32F4DISCOVERY, Espruino)

Dodano: Czwartek, 31 stycznia 2013, godzina 23:26:07
Kategoria: Moje projekty i pomysły

Jakiś czas temu, przeglądając dawno zapomniane kartony z różnymi elementami elektronicznymi natknąłem się na potłuczony, panoramiczny ekran o przekątnej 7″. Matryca z niego do niczego więcej już się nie przyda i wylądowała w pudle ze sprzętem przeznaczonym do utylizacji, ale udało mi się wymontować z niej panel dotykowy. Wstępne, organoleptyczne oględziny wykazały, że jest to najprostszy, rezystancyjny panel dotykowy z 4 wyprowadzeniami. Nie wiedziałem tylko czy jest sprawny i postanowiłem to szybko sprawdzić, wykorzystując do tego makietę STM32F4DISCOVERY oraz interpreter języka JavaScript dla ARM Cortex-M - Espruino (pisałem o tym projekcie już wcześniej - zobacz poprzednie wpisy dotyczące Espruino).

Budowa takiego panelu dotykowego nie jest zbyt skomplikowana. Najczęściej składają się one ze szklanej lub akrylowej bazy pokrytej warstwą izolacyjną oraz rozdzielonych od siebie, specjalnych powłok wykonanych z materiału rezstancyjnego ITO (Indium tin oxide). Wszystkie powłoki muszą być oczywiście przezroczyste, przynajmniej na tyle żeby nie zasłaniały całkiem obrazu na umieszczonym pod panelem ekranie, stąd właśnie zastosowanie takich, a nie innych materiałów.

Powłoki rozdziela się od siebie mikroskopijnymi elementami dystansującymi, które czasami można dostrzec, dokładnie przyglądając się panelowi pod światło (to te równo rozłożone “kropki”). Na krawędziach obu warstw napylone zostają również elektrody umożliwiające dołączenie przewodów, a w rezultacie podłączenie panelu do jakiegoś układu kontrolera. Istotne jest umiejscowienie elektrod - na jednej warstwie będą to krawędź dolna oraz górna, a na drugiej lewa i prawa.

Schemat pochodzi z dokumentu Using resistive touch screens for human/machine interface.

Obsługa tego typu paneli od strony elektrycznej jest wyjątkowo prosta. Wystarczy przyłożyć jakieś napięcie pomiędzy elektrody jednej z warstw, a na jednej z elektrod drugiej warstwy odczytać wartość napięcia. Będzie ono proporcjonalne do odległości punktu styku od elektrod (krawędzi) z warstwy, na której przyłożone zostało napięcie. Dzieje się tak dlatego, że w momencie naciśnięcia panelu dochodzi do styku dwóch warstw rezystancyjnych, w wyniku czego otrzymujemy dzielnik napięcia. Żeby poznać obie współrzędne punktu, w którym nastąpiło naciśnięcie panelu wykonujemy naprzemiennie operację zasilenia jednej warstwy i odczytu napięcia na jednej z elektrod drugiej warstwy. I tak w kółko, z dużą częstotliwością. Wartość zero odczytanego napięcia oznacza oczywiście brak dotyku, a ze względu na taką budowę panelu, możliwe jest jednoczesne dotykanie go tylko w jednym punkcie.

Po więcej informacji o obsłudze rezystancyjnych ekranów dotykowych odsyłam do poniższych dokumentów oraz jednej strony:

Gotowe układy scalone do obsługi takich paneli wykorzystują tylko 4 wyprowadzenia. Jeżeli dysponujemy mikrokontrolerem, który posiada możliwość zmiany funkcji wyprowadzeń, a aktualnie większość taką funkcjonalność ma, to do obsługi panelu również wystarczą 4 wyprowadzenia. Ja wykorzystałem do tego celu płytkę ewaluacyjną STM32F4DISCOVERY z mikrokontrolerem, z rdzeniem serii ARM Cortex-M4 oraz interpreter języka JavaScript o nazwie Espruino.

Sposób podłączenia, zgody z kodem programu z dalszej części, jest następujący (oznaczenia stron są poprawne patrząc na panel od strony warstw rezystancyjnych, czyli strony reagującej na dotyk):

  • PA1 - elektroda dolna
  • PA2 - elektroda lewa
  • PC8 - elektroda górna
  • PC9 - elektroda prawa

Lutowania przy tym było bardzo niewiele, niezbędne było jedynie podłączenie przewodów do tasiemki z panelu i dołączenie ich do odpowiednich wyprowadzeń mikrokontrolera. Poniżej zdjęcie mojej konfiguracji.

Niewielki program do obsługi panelu podzielony został na 3 funkcje:

  • readX() - ustawia wyprowadzenia w konfiguracji do odczytu współrzędnej horyzontalnej (X) i zwraca wartość na wejściu przetwornika A/D
  • readY() - ustawia wyprowadzenia w konfiguracji do odczytu współrzędnej wertykalnej (Y) i zwraca wartość na wejściu przetwornika A/D
  • printPosition() - odczytuje kolejno wartości współrzędnych, sprawdza czy panel rejestruje dotyk i wyprowadza na konsoli odczyt w postaci “X Y”

Ostatnia funkcja wywoływana jest cyklicznie, przy pomocy setInterval(), z okresem 5 ms (wartość należy dobrać metodą prób i błędów, im wyższa, tym więcej “zgubimy” odczytów położenia).
Kod wspomnianych funkcji zamieszczam poniżej.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var pinLeft	= A2;
var pinRight	= C9;
var pinTop	= C8;
var pinBottom	= A1;
 
function readX(){
	// supply voltage between left and right electrodes
	digitalWrite(pinLeft, 0);
	digitalWrite(pinRight, 1);
 
	// set top electrode as input
	digitalRead(pinTop);
 
	// read voltage level on bottom electrode
	return analogRead(pinBottom);
}
 
function readY(){
	// supply voltage between bottom and top electrodes
	digitalWrite(pinBottom, 1);
	digitalWrite(pinTop, 0);
 
	// set right electrode as input
	digitalRead(pinRight);
 
	// read voltage level on left electrode
	return analogRead(pinLeft);
}
 
function printPosition(){
	var x = readX();
	var y = readY();
	if(x > 0.05 && y > 0.05){
		print(Math.round(1000*x) + " " + Math.round(1000*y));
	}
}

W Espruino funkcja analogRead() zwraca wartość rzeczywistą z zakresu 0~1. Stąd w warunku, w funkcji printPosition() sprawdzane jest, czy któryś z odczytów jest większy od wartości 0,05 (próg, który oznacza rejestrację dotyku), którą należy ustalić metodą prób i błędów. Przemnożenie i zaokrąglenie jest wykonywane tylko w celu łatwiejszego odczytania wartości w konsoli, przykładowe odczyty poniżej.

Na koniec postanowiłem napisać jeszcze malutką aplikację w języku C# do wizualizacji odczytu z panelu na ekranie. Program umożliwia podłączenie się do portu szeregowego, uruchomienie odczytu na makiecie STM i odwzorowuje odczyty położenia na kontrolce PictureBox. Ponadto, umożliwia również wykonanie prostej kalibracji, która polega na zapisaniu najmniejszych i największych rejestrowanych wartości (w czasie kalibracji trzeba po prostu dotknąć każdej z krawędzi panelu) w celu późniejszego przeskalowania zakresów.

Wizualizacja odczytu punktu dotyku na panelu dotykowym

Wyjaśnienia wymaga jeszcze tylko sposób uruchomienia odczytu przez program na komputerze. Zaraz po otwarciu portu szeregowego, aplikacja wysyła kolejno dwie instrukcje:

  • echo(0)
  • setInterval(printPosition, 5)

Pierwsza z nich wyłącza po stronie Espruino tzw. echo (m.in. wypisywanie zadeklarowanych zmiennych, znaku zachęty itd.), dzięki czemu w konsoli otrzymujemy wyłącznie dane w łatwym do interpretacji formacie: [pozycja X][spacja][pozycja Y][znak nowej linii]. Druga instrukcja uruchamia cykliczne wykonywanie funkcji odczytu i wypisywania położenia.

Więcej informacji o projekcie Espruino na stronie www.espruino.com.

» dodaj komentarz «





» Komentarze dodane przez niezarejestrowanych użytkowników muszą być zatwierdzone przez moderatora


» kategorie wpisów

Co nowego na stronie (wpisów: 43)
Dzikie.NET (wpisów: 16)
Humor (wpisów: 46)
Inne (wpisów: 34)
Kapsle Tymbark (wpisów: 29)
Moje projekty i pomysły (wpisów: 43)
Narzekam na… (wpisów: 16)
Nowości w galerii (wpisów: 12)
Nowości, ciekawostki (wpisów: 595)
O mnie (wpisów: 36)
Wordpress (wpisów: 1)
Zabawki (wpisów: 9)
Zdjęcie bez komentarza (wpisów: 91)
Zdjęcie z komentarzem (wpisów: 23)
Strony w domenie tech-blog.pl wykorzystują pliki cookies w celach statystycznych, analizy oglądalności oraz na potrzeby wyświetlania reklam. Jeżeli nie wyrażasz na to zgody, zmień ustawienia wykorzystywanej przeglądarki internetowej. Więcej informacji na stronie Polityka prywatności i cookies (ciasteczka).

» archiwum wpisów

styczeń 2014 (wpisów: 2)
grudzień 2013 (wpisów: 6)
listopad 2013 (wpisów: 27)
październik 2013 (wpisów: 21)
wrzesień 2013 (wpisów: 27)
sierpień 2013 (wpisów: 8)
lipiec 2013 (wpisów: 8)
czerwiec 2013 (wpisów: 6)
maj 2013 (wpisów: 16)
kwiecień 2013 (wpisów: 17)
marzec 2013 (wpisów: 18)
luty 2013 (wpisów: 22)
styczeń 2013 (wpisów: 19)
grudzień 2012 (wpisów: 20)
listopad 2012 (wpisów: 33)
październik 2012 (wpisów: 25)
wrzesień 2012 (wpisów: 15)
maj 2012 (wpisów: 1)
kwiecień 2012 (wpisów: 1)
marzec 2012 (wpisów: 1)
styczeń 2012 (wpisów: 2)
grudzień 2011 (wpisów: 1)
listopad 2011 (wpisów: 7)
październik 2011 (wpisów: 4)
wrzesień 2011 (wpisów: 1)
sierpień 2011 (wpisów: 3)
lipiec 2011 (wpisów: 2)
czerwiec 2011 (wpisów: 3)
maj 2011 (wpisów: 1)
marzec 2011 (wpisów: 3)
luty 2011 (wpisów: 5)
styczeń 2011 (wpisów: 5)
grudzień 2010 (wpisów: 6)
listopad 2010 (wpisów: 2)
październik 2010 (wpisów: 1)
wrzesień 2010 (wpisów: 4)
sierpień 2010 (wpisów: 2)
lipiec 2010 (wpisów: 4)
kwiecień 2010 (wpisów: 4)
marzec 2010 (wpisów: 12)
luty 2010 (wpisów: 4)
styczeń 2010 (wpisów: 1)
listopad 2009 (wpisów: 1)
październik 2009 (wpisów: 1)
wrzesień 2009 (wpisów: 1)
sierpień 2009 (wpisów: 3)
lipiec 2009 (wpisów: 2)
czerwiec 2009 (wpisów: 6)
kwiecień 2009 (wpisów: 1)
marzec 2009 (wpisów: 25)
luty 2009 (wpisów: 9)
styczeń 2009 (wpisów: 13)
grudzień 2008 (wpisów: 7)
listopad 2008 (wpisów: 11)
październik 2008 (wpisów: 1)
wrzesień 2008 (wpisów: 9)
sierpień 2008 (wpisów: 49)
lipiec 2008 (wpisów: 2)
czerwiec 2008 (wpisów: 39)
maj 2008 (wpisów: 52)
kwiecień 2008 (wpisów: 49)
marzec 2008 (wpisów: 58)
luty 2008 (wpisów: 38)
styczeń 2008 (wpisów: 12)
grudzień 2007 (wpisów: 16)
listopad 2007 (wpisów: 2)
październik 2007 (wpisów: 8)
wrzesień 2007 (wpisów: 16)
sierpień 2007 (wpisów: 7)
lipiec 2007 (wpisów: 3)
czerwiec 2007 (wpisów: 3)
maj 2007 (wpisów: 11)
kwiecień 2007 (wpisów: 11)
marzec 2007 (wpisów: 16)
luty 2007 (wpisów: 9)
styczeń 2007 (wpisów: 13)
grudzień 2006 (wpisów: 5)
listopad 2006 (wpisów: 4)
październik 2006 (wpisów: 13)
wrzesień 2006 (wpisów: 15)
sierpień 2006 (wpisów: 8)
lipiec 2006 (wpisów: 5)
czerwiec 2006 (wpisów: 39)
maj 2006 (wpisów: 38)
All rights reserved Copyright 2006-2012 Piotr Dymacz