Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

AVR - Panel dotykowy - stmpe811 - I2C

mirekk36 02 Gru 2011 16:51 17488 17
  • AVR - Panel dotykowy - stmpe811 - I2C
    Witam.

    Wcześniej zajmowałem się wyświetlaczem kolorowym TFT 3,5" oraz 4,3", ale pominąłem zupełnie obsługę panela dotykowego, w jaki 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 chyba bardziej popularnych układach z serii AR1000, a dokładniej o AR1020 na I2C, jednak z uwagi na to, że gdzieniegdzie można znaleźć już opisy i porady, jak z niego korzystać, to postanowiłem się zabrać za układ całkiem inny - firmy ST Micro. o symbolu STMPE811.

    Jak już zrobiłem układ i udało się go oprogramować, to zupełnie wybiłem sobie 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. Niemniej jednak dla takich możliwości warto tą wprawę nabyć i go podlutować ;)

    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 samego faktu 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, jak i 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 układ wymaga jednak 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ą przygotowałem samodzielnie. W zasadzie nie różni się ona mocno od tej z PDF'u, ale jak wiadomo - diabeł tkwi w szczegółach albo w pojedynczych bitach...

    Dlatego np. w PDF'ie przerwanie domyślnie 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'u.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Tak to wygląda u mnie i działa jak na załączonym filmie poniżej ;)
    Sama obsługa przerwania, a zrobiłem to na INT0 (akurat) też jest inna niż w przykładach z PDF'u. Odnośnie przykładów - ktoś zrobił błędy w kilku miejscach i gdy próbowałem to wprost zaadoptować, powychodziły jakieś dziwolągi.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    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 troszkę skaczą i że ciężko uzyskać rozdzielczość co do 1-go pixela, ale to nie jest przecież w ogóle 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:


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    mirekk36
    Poziom 42  
    Offline 
    Ciekawy kurs VIDEO - EAGLE - zajrzyj na mój blog
    mirekk36.blogspot.com - VOLATILE ? to łatwe

    Specjalizuje się w: programowanie: avr c, delphi pc, android
    mirekk36 napisał 9195 postów o ocenie 2225, pomógł 964 razy. Mieszka w mieście Szczecin. Jest z nami od 2006 roku.
  • #2
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #3
    mirekk36
    Poziom 42  
    Tak wspomniałem nawet w tekście o tych scalakach z serii AR1xxx , ale jak mówiłem chciałem spróbować jeszcze czegoś innego - a bardzo pasowało mi też to że można komunikować się po I2C bo RS232 trochę mi szkoda byłoby na to. Ale tak jak piszesz, scalaczki z rodziny AR1xxx też są bardzo fajne.
  • #4
    h3c4
    Poziom 14  
    Ja jestem ciekawy jak się realizuje hmm to czyszczenie tego kółeczka po naciśnięciu ekranu..
    Tzn tu nie czyścisz całego ekranu (odświeżasz) tylko rysujesz niebieski kwadrat opisany na tym kółko tak żeby je zamalować?
  • #5
    mirekk36
    Poziom 42  
    h3c4 napisał:
    Ja jestem ciekawy jak się realizuje hmm to czyszczenie tego kółeczka po naciśnięciu ekranu..
    Tzn tu nie czyścisz całego ekranu (odświeżasz) tylko rysujesz niebieski kwadrat opisany na tym kółko tak żeby je zamalować?


    Nie dużo prościej. Gdybym miał większy/szybszy procek jakiś ARM to korzystałbym sobie jeszcze z odczytu pamięci ekranu. Ale w takim przypadku po prostu rysuję kółko czy jakiś tam znaczek a po kilkudziesięciu milisekundach, w tej samej pozycji rysuję je ponownie tylko, że kolorze tła ;)
  • #6
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #7
    mirekk36
    Poziom 42  
    napisał:
    mirekk36 napisał:
    bo RS232 trochę mi szkoda byłoby na to


    No niby tak. Ale jak używa się procka z 4-rema lub 6-cioma uartami sprzętowymi to nie stanowi to problemu ;)


    W zasadzie to racja, nawet jak już się ma pod ręką 2 UART'y ;) ... a komunikacja nawet jakaś taka jakby bliższa wtedy ;)
  • #8
    saper_2
    Poziom 17  
    Zwróciłeś moją uwagę tym układem, gdyż mam parę szt LCD B/W z odzysku z panelami dotykowymi, a obsługa jak piszesz z ADC procesora zajmuje całkiem sporo zasobów, mi zajęła o ile dobrze pamiętam ok 1-1,5kb kodu (na bazie AVRxxx Atmela pisałem)... I oczywiście było to trochę powolne...

    AR1020 tutaj ,a wyszukiwarka microchipa na pytanie "STMPE811" milczy, ale google na szczęście nie :) i STMPE811 nie jest produkcji Microchip ,a ST Microelectronics :)

    --- dopisano ---

    Układ interesujący, ale niestety nie da się go kupić w Polsce w detalu (nawet Farnell ich nie ma w swoim wypasionym katalogu ;) ) nie wspominając o rozsądnej cenie, a to jak sam wiesz stanowi największą barierę dla nas hobbystów elektroników.
  • #9
    mirekk36
    Poziom 42  
    saper_2 napisał:

    AR1020 tutaj ,a wyszukiwarka microchipa na pytanie "STMPE811" milczy, ale google na szczęście nie :) i STMPE811 nie jest produkcji Microchip ,a ST Microelectronics :)


    O Matko! w ostatnich moich wątkach na DIY, to już drugi raz taka wtopa z mojej strony ;) przepraszam bardzo. Poprzednio kolega zwrócił mi też uwagę, że przetwornica ST1S10 nie jest Microchipa jak pisałem a firmy ST Micro...

    Nie wiem co mi się ta nazwa Microchip plącze i plącze po głowie ;)
  • #10
    tadzik85
    Poziom 38  
    A gdzie można dostać ten układzik??
  • #11
    mirekk36
    Poziom 42  
    tadzik85 napisał:
    A gdzie można dostać ten układzik??


    No właśnie - widzę, że są z nim poważne problemy jak ktoś pisał wcześniej :( ale teraz znalazłem je w mouser.com .... i zobaczę czy tam da radę kupić ;)
  • #12
    excray
    Poziom 39  
    Nie bardzo rozumiem w czym jest tak wielki problem z odczytem pozycji XY z rezystancyjnego panelu dotykowego. Jak dla mnie to kwestia 4 pinów i dwóch odczytów z ADC. O wiele ciekawsza jest kwestia szybkiego wykrywania czy odczyt jest w polu jakiegoś przycisku ekranowego.
  • #13
    mirekk36
    Poziom 42  
    excray napisał:
    Nie bardzo rozumiem w czym jest tak wielki problem z odczytem pozycji XY z rezystancyjnego panelu dotykowego. Jak dla mnie to kwestia 4 pinów i dwóch odczytów z ADC. O wiele ciekawsza jest kwestia szybkiego wykrywania czy odczyt jest w polu jakiegoś przycisku ekranowego.


    Proponuję sobie poczytać o możliwościach takich scalaków a szczególnie tego ;) Pomiary X, Y ale i Z z 12-bitową rozdzielczością, czyli pomiar siły nacisku, ustalanie czasów próbkowania, śledzenie kilku punktów, okienkowanie i wiele różnych gadżetów. Bo nie chodzi o to że jest jakiś większy czy mniejszy problem z prostym odczytem ....

    A do tego szybkość i prostota obsługi więc o czym tu mówimy? ;) to dlatego ja wolę specjalizowane scalaczki do takich celów. Tym bardziej, że jak pisałem procka w przypadku obsługi kolorowych LCD czeka o wiele cięższa praca.
  • #14
    Morpheusss
    Poziom 15  
    Coraz częściej LCD ze zintegrowanym touchem mają już takie kontrolery na I2C a nie wyjście analogowe, więc jest to krok w dobrą stronę. Ponadto... jeśli budujemy jakiś układ oparty o linuxa, wystarczy dodać sterownik do doucha na I2C i gotowe. Przy używaniu wewnętrznych ADC do obsługi toucha jest więcej zamieszania.
  • #15
    mirekk36
    Poziom 42  
    Morpheusss napisał:
    ....Przy używaniu wewnętrznych ADC do obsługi toucha jest więcej zamieszania.


    No a szczególnie jak chcemy zrobić sobie jeszcze pomiar wielopunktowy ;) np dotyk dwoma palcami naraz (gesty) itp ....

    A tu? a tu w tak prostej postaci mamy to wszystko załatwione w scalaczku, tzn gestów to on nie obsługuje ale na podstawie nadsyłanych wielu próbek w krótkim czasie łatwo już je sobie tylko przeanalizować i obrobić po swojemu.

    Zresztą panowie, tu macie przykład z bardzo wolniutkim prockiem do takiego wyświetlacza potwora - a proszę bardzo jak szybko mogę odbierać i analizować dane bez zbędnej zwłoki na obsługę ADC w procku.

    Na szczęście scalaczki są już dostępne ;)
  • #16
    Użytkownik usunął konto
    Użytkownik usunął konto  
  • #17
    mirekk36
    Poziom 42  
    Cytat:
    A ja mam pytanie trochę z innej beczki. Czy przylutowanie tego pola pod scalakiem jest niezbędne do jego prawidłowej pracy? :)


    Powinno się go do masy podłączyć.
  • #18
    Użytkownik usunął konto
    Użytkownik usunął konto