logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Obsługa przycisków dotykowych za pomocą mikrokontrolera AVR

Kubald 17 Kwi 2013 16:29 16320 3
  • Obsługa przycisków dotykowych za pomocą mikrokontrolera AVR

    Autor zastanawiał się, jak zaimplementować w projekcie interfejs bardziej elegancki, niż zwykle stosowane przyciski. Częściowo zainspirowany materiałami wideo umieszczonymi przez D. Jones'a na stronie EEVBlog, postanowił zainteresować się pojemnościowymi przyciskami dotykowymi. Zwykle jednak wadą tego typu rozwiązań jest konieczność wykorzystania dedykowanych do obsługi przycisków dotykowych układów scalonych. Ale z zastosowaniem kilku sztuczek można też w tym celu wykorzystać zwykły mikroprocesor! Do tego celu wystarczy zaledwie rezystor i jedno wolne wyprowadzenie mikrokontrolera.

    Firma Atmel obecnie dostarcza też biblioteki QTouch do obsługi przycisków dotykowych w produkowanych przez siebie procesorach. Niestety, biblioteki stanowią oprogramowanie zamknięte, które nie przydało się autorowi w projektowaniu urządzenia. Jednak po przejrzeniu dostępnej dokumentacji autor odkrył, jak obsługiwać takie przyciski. Oferowane biblioteki umożliwiają kontrolę przycisków dotykowych z wykorzystaniem przetwornika A/D procesora i przyłączonego do niego rezystora. Lecz jak jest to dokładnie realizowane? Czy można zrobić to samemu? - zastanawiał się autor.

    Teoria działania:
    Po przemyśleniach i przeszukaniu zasobów Internetu autor wpadł na kilka pomysłów, jak tego dokonać. Nie wiadomo, czy prezentowane rozwiązanie jest zbliżone do rozwiązań firmy Atmel, ale działa równie dobrze. Poniżej można zobaczyć schemat blokowy obwodów wejściowych procesora AVR, które autor wykorzystał w swoim rozwiązaniu:

    Obsługa przycisków dotykowych za pomocą mikrokontrolera AVR

    Kondensator umieszczony po lewej stronie reprezentuje przycisk dotykowy - czyli po prostu duże, okrągłe pole miedzi na płytce drukowanej. Pole takie zawsze posiada pewną pojemność rozproszoną względem masy; pojemność zmienia się, kiedy do pola przykładany jest palec. Wszystkie elementy po prawej od czarnej, przerywanej linii to obwody mikroprocesora. Zwykle, przed podaniem sygnału na wejście A/D procesora stosuje się rezystor, aby wyeliminować możliwość zakłóceń elektrycznych i magnetycznych, tutaj nie został on pokazany ze względu na czytelność rysunku.

    Rezystor podciągający jest częścią obwodu wejścia/wyjścia mikrokontrolerów AVR. O tym, z którego wyprowadzenia procesora napięcie podane będzie na przetwornik A/D decyduje ustawienie multipleksera. Multiplekser pozwala też na przyłączenie do przetwornika potencjału masy.

    Również układ próbkujący z pamięcią (sample&hold) jest częścią obwodów przetwornika A/D. Po rozpoczęciu konwersji kondensator układu próbkującego ładuje się do poziomu napięcia podawanego na przetwornik za pomocą wybranego multiplekserem wejścia. Po naładowaniu kondensatora układ próbkujący jest odłączany, a przetwornik mierzy wartość napięcia na kondensatorze.

    Przy obsłudze przycisków dotykowych potrzebny jest pomiar pojemności takiego przycisku - czyli zewnętrznego kondensatora. Pomiaru tego można dokonać z wykorzystaniem pojemności układu próbkującego.

    Obsługa przycisków dotykowych za pomocą mikrokontrolera AVR

    Poprzez uaktywnienie rezystora podciągającego, przycisk dotykowy - zewnętrzny kondensator, niezależnie, czy jest, czy nie, przyłożony do niego palec - ładowany jest napięciem do poziomu +5V. W tym samym czasie, za pomocą multipleksera wejście przetwornika A/D łączone jest z masą, co rozładowuje kondensator w układzie próbkującym. Dzięki temu zewnętrzny kondensator naładowany jest do +5V, a na wewnętrznym potencjał wynosi 0V.

    Obsługa przycisków dotykowych za pomocą mikrokontrolera AVR

    Następnie, po dezaktywacji rezystora podciągającego i po odpowiednim ustawieniu multipleksera do wejścia przetwornika A/D przyłączany jest przycisk dotykowy,;w tym momencie przetwornik rozpoczyna konwersję. W skutek tego następuje równoległe połączenie dwu pojemności. Wtedy będzie miał miejsce przepływ ładunku z kondensatora naładowanego do wyższego napięcia do drugiego kondensatora; będzie to trwało do momentu zrównania wartości napięć na kondensatorach. Więc końcowe napięcie zależy od wartości pojemności kondensatorów. Ponieważ kondensator układu próbkującego ma ustaloną pojemność - 14 pF - mierzone napięcie będzie zależało jedynie od pojemności przycisku dotykowego:

    Jeśli wynosić będzie ona dokładnie 14 pF, zmierzone napięcie powinno być równe 2,5V.
    Jeśli wynosić będzie ona mniej niż 14 pF, zmierzone napięcie powinno być mniejsze od 2,5V.
    I analogicznie - jeśli wynosić będzie ona więcej niż 14 pF, zmierzone napięcie powinno być większe od 2,5V.

    Dzięki temu, w momencie naciśnięcia przycisku mierzone przez przetwornik A/D wartości powinny rosnąć.

    Część sprzętowa:
    Aby sprawdzić działanie tak obmyślonego przycisku w praktyce, należało zbudować płytkę testową. Płytka została zaprojektowana w KiCADzie.

    Najważniejsze jej elementy to:
    Procesor ATMega32u4 z wbudowanym kontrolerem USB
    3 przyciski pojemnościowe
    Linijka dotykowa składająca się z 4 segmentów
    10-bitowy przetwornik A/D
    Dioda RGB do testów
    2 diody wskazujące stan płytki

    Przyciski pojemnościowe przyłączone są do wejść procesora poprzez rezystory o wartości około 10 kΩ. Pod przyciskami nie umieszczono pola miedzi połączonego z masą, ponieważ zwiększyłoby to ich pojemność - a w tym rozwiązaniu chodzi o to, by był ona możliwie jak najmniejsza.

    Obsługa przycisków dotykowych za pomocą mikrokontrolera AVR

    Przyciski zostały zaklejone taśmą kaptonową - dotykanie ich gołymi palcami powodowało generowanie zakłóceń na wyjściu przetwornika A/D, a w komercyjnych zastosowaniach przyciski i tak przykrywane są zwykle soldermaską i nadrukiem.

    Oprogramowanie:
    Program obsługujący przyciski został napisany przez autora w C i skompilowany w AVR GCC. Autor nie udostępnia części kodu związanej z obsługą portu USB (w tym celu wykorzystał on otwartą bibliotekę LUFA do stworzenia wirtualnego portu szeregowego, co dało możliwość podglądu wartości generowanych przez przetwornik A/D) i sterowaniem diodą RGB za pomocą PWM. Omówieniu podlegać więc będzie jedynie część kodu odpowiadająca za kontrolę przycisków.

    Autor starał się, aby przygotowany kod był modułowy i wyglądał czytelnie. Każdy przycisk posiada zdefiniowaną zmienną obiektową wewnątrz struktury funkcji.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    *port oraz portmask odpowiadają za stan rezystora podciągającego. mux określa stan multipleksera.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Inicjalizacja jest typowa, jak przy innych pomiarach z wykorzystaniem przetwornika A/D. Następnie implementowane są funkcje do obsługi pojemnościowych przycisków dotykowych.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Sposób ich wykorzystania jest następujący:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Rzecz jasna, kod może zostać jeszcze bardziej zoptymalizowany. W zaprezentowanym rozwiązaniu konwersja A/D zachodzi wolno, wymagane jest oczekiwanie na jej zakończenie. Użycie przerwań i timerów pozwoliłoby na wydajniejszą obsługę konwersji. Użycie filtru ze średnią kroczącą w miejsce dokonywania czterech pomiarów dla każdego przycisku byłoby również dobrym pomysłem.

    Rezultaty:
    Jak można zobaczyć na poniższym filmie...



    ...przyciski działają!

    Wyniki pomiarów zależą od rozdzielczości przetwornika A/D, 10-bitowy przetwornik daje wartości z zakresu od 0 do 1023. Niewciśnięty przycisk dawał wartości rzędu 500 (niewiele większa była wartość rejestrowana dla przycisku najbardziej po prawej, zapewne ze względu na długość ścieżki i jej przebieg tuż obok pola masy), które wzrastały do około 800 po naciśnięciu przycisku; dokładna wartość zależała od siły nacisku. Umieszczenie urządzenia na macie antyelektrostatycznej spowodowało wzrost wartości dla niewciśniętego przycisku o niewielką, ale niepomijalną wartość (rzędu około 30).

    Do zrealizowania pozostała jeszcze obsługa linijki dotykowej.

    Źródło

    Fajne? Ranking DIY
    O autorze
    Kubald
    Poziom 15  
    Offline 
    Specjalizuje się w: spektroskopia exafs/xanes, uc, it
    Kubald napisał 188 postów o ocenie 112. Mieszka w mieście Kraków. Jest z nami od 2004 roku.
  • #2 12209904
    MACIEK_M
    Poziom 29  
    Kiedyś wpadłem na coś podobnego Tu ale nie miałem okazji wypróbować.
  • #3 12288507
    bartes20
    Poziom 2  
    Z tego co wiem to metoda ta jest opatentowana przez firmę Microchip w trochę
    bardziej rozbudowanej wersji - robią pomiar różnicowy. W jednym kroku ładują przycisk pojemnościowym a w następnym pojemność sample and hold.
    Atmel w swoim QTouch'u robi to w odmienny sposób.
    Może ktoś jeszcze ma inne ciekawe pomysły jak zrobić takie klawisze.

    Pozdrawiam
  • #4 14237216
    DJKompot
    Poziom 26  
    Testowałem osobiście ten kod. Działa to fajnie ale jest jeden błąd w kodzie. Odpaliłem program a ATMega328 i nie działał ADC0.

    Należy zmienić to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Na to:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA