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:
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.
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.
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.
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++
*port oraz portmask odpowiadają za stan rezystora podciągającego. mux określa stan multipleksera.
Kod: C / C++
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++
Sposób ich wykorzystania jest następujący:
Kod: C / C++
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
