Obsługa rezystancyjnego panelu dotykowego z STM32 (STM32F4DISCOVERY, Espruino)
Dodano: Czwartek, 31 stycznia 2013, godzina 23:26:07Kategoria: 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:
- Using resistive touch screens for human/machine interface (Texas Instruments)
- AVR341: Implementing Four and five-wire Touch screen Controller using tinyAVR and megaAVR devices (Atmel)
- Touch Screen (4-wire) (make.larsi.org)
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.
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.
» Podobne wpisy (według tagów)
» Tagi dla tego wpisu:
ARM Cortex-M4 • C# • Espruino • JavaScript • panel dotykowy • programowanie • STM32 • STM32F4DISCOVERY
» dodaj komentarz «