Ads_700x200

piątek, 2 grudnia 2011

Panel Dotykowy na scalaku stmpe811 - I2C

Wcześniej zajmowałem się wyświetlaczem kolorowym TFT 3,5" oraz 4,3" Link ale pominąłem zupełnie obsługę panela dotykowego w jaki on był wyposażony. Rozważałem wstępnie skorzystanie bezpośrednio z przetwornika ADC w mikrokontrolerze do jego obsługi, jednak zainteresowały mnie układy scalone, które taką obsługę powinny znacznie ułatwiać a przez to dawać większe możliwości jeśli chodzi o wydajność własnego programu w tak małym procku jak AVR, który przecież musi obsłużyć dość spory i kolorowy wyświetlacz LCD. Na początku myślałem o popularnych chyba bardziej układach z serii AR1000 a dokładniej o AR1020 na I2C, jednak z uwagi na to, że gdzie niegdzie można znaleźć już opisy i porady jak z niego korzystać, to postanowiłem się zabrać za całkiem inny układ, firmy ST Micro. o symbolu STMPE811



Generalnie, jak już zrobiłem układ i udało się go oprogramować to wręcz wybiłem sobie absolutnie z głowy próby podłączania takich paneli bezpośrednio do procka. Bo jak pisałem można, ale jakość, szybkość, dokładność i ciekawe możliwości jakie oferują takie scalaki, przy ich niewielkich rozmiarach i wygodnej obsłudze po I2C zdecydowanie przemawiają za ich wykorzystaniem właśnie. 

tak to wygląda na PCB: 
AVR - Panel dotykowy - stmpe811 - I2C 

Dlatego chciałem się podzielić kilkoma uwagami odnośnie takiego podstawowego uruchomienia obsługi panela dotykowego na takim scalaku. A to z uwagi na to, że jak wspominałem, rzadko można spotkać jakiś opis jego wykorzystania z AVR'kiem a z drugiej strony jest on nawet pinologicznie mniejszy niż AR1020 i sama aplikacja jest nieskomplikowana. Tylko obudowa jego QFN16 może stanowić pewien problem z przylutowaniem, jeśli ktoś nie ma wprawy. Nie mniej jednak dla takich możliwości wartą tą wprawę nabyć i go podlutować Wink 

Tak wygląda schemat - przyznacie że prosty. 

AVR - Panel dotykowy - stmpe811 - I2C 

Sam układ posiada ciekawe możliwości, ja jednak skorzystałem z podstawowych, tj. wykrywania współrzędnych miejsca dotknięcia ale także sam fakt dotknięcia i zwolnienia. Układ zasilany jest napięciem 3,3V i takim samym napięciem zasiliłem swój mikrokontroler, zresztą także sam LCD działa na 3,3V. Dzięki temu nie potrzebowałem żadnych konwersji. Na końcu przedstawię filmik, na którym widać operacje wykonywane przy taktowaniu procka jedynie 11,0592MHz. 

Szybkość i dokładność działania jest rewelacyjna. Układ tak w ogóle posiada 12-bitowe przetworniki ADC, jednak ja zmniejszam sobie rozdzielczość do 9-bitów gdyż w tym przypadku jest wystarczająca. W załączniku zamieszczam zarówno notę PDF układu ale także notę PDF, która opisuje i pokazuje jak w podstawowy sposób oprogramować i zainicjalizować ten układ scalony. Wszystko wyglądałoby pięknie, gdyby nie to, że jednak układ wymaga inicjalizacji i poustawiania sporej ilości rejestrów żeby rozpocząć prawidłową pracę. A ponieważ przykłady zapewne pochodzą od procków PIC, to okazuje się, że tak wprost po inicjalizacji są pewne problemy z działaniem na AVR'ku' Dlatego poniżej przedstawię inicjalizację jaką ja przygotowałem. W zasadzie nie różni się ona mocno od tej z PDF'a ale jak wiadomo diabeł tkwi w szczegółach albo w pojedynczych bitach .... 

Dlatego np w PDF'ie domyślnie przerwanie było wyzwalane poziomem i przestawiłem na zbocze.... Plus kilka innych drobiazgów ale to już łatwo każdemu będzie dojść mając do porównania kod mojej inicjalizacji oraz kod z PDF'a 




void stmpe811_init() {
stmpe811_write_reg( 0x04, 0x0c );
stmpe811_write_reg( 0x0a, 0x07 );
stmpe811_write_reg( 0x20, 0x49 );
_delay_ms(2);
stmpe811_write_reg( 0x21, 0x01 );
stmpe811_write_reg( 0x17, 0x00 );
stmpe811_write_reg( 0x41, 0x9a );
stmpe811_write_reg( 0x4a, 0x01 );
stmpe811_write_reg( 0x4b, 0x01 );
stmpe811_write_reg( 0x4b, 0x00 );
stmpe811_write_reg( 0x56, 0x07 );
stmpe811_write_reg( 0x58, 0x01 );
stmpe811_write_reg( 0x40, 0x03 );
stmpe811_write_reg( 0x0b, 0xff );
stmpe811_write_reg( 0x09, 0x03 );
}

Tak to wygląda u mnie i działa dzięki temu tak jak na załączonym filmie poniżej Wink
Sama obsługa przerwania, a zrobiłem to na INT0 (akurat) też jest inna niż w przykładach z PDF'a.... zresztą tam coś jest w ogóle nie tak z tymi przykładami, coś się komuś pomyliło w kilku miejscach, i jakieś w ogóle dziwolągi wychodziły mi gdy próbowałem to wprost zaadoptować: 


ISR( INT0_vect ) {
stmpe811_read_buf( 0x0b, 1, buf);

if( buf[0] & 0x02 )  {
stmpe811_read_buf( 0x4d, 2, buf);
stmpe811_read_buf( 0x4f, 2, &buf[2]);

stmpe811_write_reg( 0x0b, 0x02 );
          int0_flag = 1;
} else {
stmpe811_write_reg( 0x0b, 0x01 );
}
}

Inaczej zatem niż w kodzie z noty PDF, ja postanowiłem odczytywać od razu wartości 16-bitowych rejestrów zawierających (tutaj tylko) koordynanty X oraz Y. Pominąłem Z (ta daje informację o sile nacisku zdaje się). Jak pisałem wcześniej wartości w tych rejestrach są 12-bitowe. W przerwaniu jak widać wczytuję odczytane rejestry do bufora, do kolejnych komórek i ustawiam flagę, która później sprawdzana jest w pętli głównej. I to właśnie już w pętli głównej na spokojnie że tak powiem, można sobie zmniejszyć rozdzielczość bitową a także przeliczyć wartości ADC już na konkretne współrzędne X oraz Y. W zależności od nich jak widać na filmiku oraz od tego czy ekran jest dotykany czy nie - pojawia się kółko wokół miejsca dotyku. Pojawiają się także na ten czas współrzędne X oraz Y. Wiadomo, że czasem one troszkę hmm skaczą i że ciężko uzyskać rozdzielczość co do 1-go pixela - no ale to nie jest absolutnie przecież potrzebne. Mając więc współrzędne można już pięknie analizować gdzie dotykamy naszym paluchem bądź rysikiem i w zależności od tego realizować różne funkcje.

Uprzedzam, że celem tego projektu jest próba zainteresowania tego typu scalaczkami do obsługi paneli dotykowych, gdyż często nawet tu na forum poczytać można wątki, gdzie zwykle ludzie piszą iż coś tam nie wychodzi z takimi scalakami i męczą się z obsługą ADC w procku.

Poniżej króki filmik z działania w praktyce: 




9 komentarzy:

  1. Mirek może posiadasz zrobioną bibliotekę w Eagle'u tego elementu?

    OdpowiedzUsuń
  2. I jeszcze jedna kwestia - w Twojej drugiej książce na stronie 305 znajduje się schemat. Zasilasz na nim układ STMPE811 napięciem 5V i dokonujesz dopasowania linii I2C.

    Dlaczego zasilasz układ 5V (wnioskuje po oznaczeniu Vcc i obecności układu konwersji magistrali danych), jeśli nota katalogowa producenta wyraźnie mówi, iż napięcie zasilania to max. 3,3V?

    http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00186725.pdf

    OdpowiedzUsuń
    Odpowiedzi
    1. Absolutnie i zdecydowanie nie zasilam scalaka STMPE811 napięciem +5V bo to byłaby zbrodnia a może nawet anihilacja ;)

      Musisz baczniej przyjrzeć się pewnemu stałemu trick'kowi który robię przygotowując swoje przeróżne konwertery napięciowe. I teraz kwestia na który schemat w książce się patrzysz? Jeśli na ten, na którym jest w pojedynkę TYLKO sam STMPE811 - to tam napis VCC wcale nie musi przecież ozaczać +5V .... VCC to po prostu zasilanie a w tym wypadku musi być +3,3V, więc tu mamy jasność mam nadzieję.

      Jeśli zaś mówisz o tym dużym schemacie konwertera dwudnapięciowego do wyświetlacza graficznego LCD TFT - to spójrz tam na dole na taką zworkę. Napięcie z zewnątrz przychodzi na środkowy pin oznaczony jako V+ i to zależy od użytkownika jak ją podłączy. Jeśli chce całość zasilać +5V to proszę bardzo ale trzeba ją odpowiednio ustawić - wtedy zasilanie +3,3V leci do układów scalonych na płycie ze stabilizatora LM1117-3.3 ;) .... ale jeśli chce podłączyć to do procka który już jest zasilany +3,3V i tylko ma takie napięcie to przestawiamy zworkę, omijamy LM1117-3.3 i całość traktujemy napięciem +3,3V.

      więc żadnej skuchy tu nie ma - ale oczywiście nie można się pomylić i np zasilać z zewnątrz napięciem +5V a zworkę ustawić w pozycji +3,3V bo może być niewesoło ;)

      Usuń
    2. Witam.
      Chciałbym spytać czy da się wykorzystać wyświetlacz dotykowy ze starego PDA pracował na WIN NT4?

      Usuń
    3. Myślę, że się da - czemu by nie ? ;) jeśli jest rezystancyjny to na pewno ruszy z tym scalakiem.

      Usuń
    4. Trochę nie bardzo wiem co znacz że jest rezystancyjny jestem laikiem i od niedawna czytam pana blog jest super poradniki są odlotowe zamierzam nauczyć się języka C i zamierzam kupić pana książkę.

      Usuń
    5. No ok ale jeśli jesteś laikiem to na razie zostaw sobie na dużo dużo później takie rzeczy ok ? ;) bo inaczej no nie da rady.

      Musisz poczytać czym różnią się panele rezystancyjne od pojemnościowych - bo nie będę tego w stanie tu wyjaśnić teraz ok ? :(

      ale jak mówisz zacznij mniejszymi kroczkami - bo na pewno jeśli nie wiesz czym się różnią to nawet jeśli byłby to rezystancyjny to nie dałbyś rady tego obsłużyć ok?

      A w trakcie nauki C zadawaj pytania - zawsze chętnie pomogę, zresztą nie tylko ja - zapraszam też na nasze forum:

      www.forum.atnel.pl

      Usuń
    6. Mirku VCC oznacza zasilanie układów TTL one nie są zasilane 3.3V.
      Pozdrawiam

      Usuń
    7. VCC oznacza zasilanie, może ono przyjmować różne wartości.

      Usuń