Przyciski dotykowe w kilka minut (Bascom AVR)

Przyciski dotykowe w kilka minut (Bascom AVR)

Witam wszystkich zainteresowanych!

Tym razem chciał bym się pochwalić, dość nietypowym wykonaniem panelu dotykowego,
opartego o dowolny mikrokontroler z rodziny AVR (może być Attiny 13, Atmega 8, Atmega 32, itp…),
Program został napisany w środowisku Bascom AVR.

Wiadomo, że są układy specjalnie przeznaczone do tych celów, lecz ja potrzebowałem panelu dotykowego na przysłowiowe wczoraj, a niestety nie miałem w swoim magazynku żadnego układu Qtouch ;).
Trochę pomyślałem, wykonałem wiele prób, aż udało mi się stworzyć program, który działa bezbłędnie.

Zasada działania:
1. Pin uC do którego podłączony jest sensor (pole dotykowe), jest ustawiany jako port, o stanie 0 (reset), a następnie po 20us,
konfigurowany jest jako wejście o stanie 1.
2. Kolejną czynnością, którą wykonuje mikroprocesor jest odczekanie odpowiednią ilość taktów, którą należy dobrać. (komenda NOP (język ASM), zatrzymuje procesor na jeden cykl zegara. 5 NOP’ów to 5 cykli zegara. Można użyć też “waitus”, tyle że trzeba dokładnie sobie przeliczyć ile trwa cykl, przy danym taktowaniu.)
UWAGA! Ilość NOP’ów uzależniona jest od szybkości taktowania procesora, oraz od pojemności pól dotykowych. Zmieniając ilość NOPów zmienia się czułość na dotyk.
3. Jeśli po przystawieniu palca do pola dotykowego, rozładujemy stan wysoki, przywracając stan niski, oznacza to dotyk, co przekłada się na wyjście z podłączoną diodą LED.

Wykonanie:
Najlepsze efekty przynosi laminat dwustronny o grubości 1mm. Warstwa czołowa przedstawia obrysy przycisków (w tym przypadku wycięty mini szlifierką), na który została naklejona taśma izolacyjna, a warstwa tylnia pozostaje nienaruszona – podłączona do masy (-).
Przyciski mogą być dowolnej wielkości, i kształtu. Kable łączeniowe z polami dotykowymi nie powinny być dłuższe niż 15cm. Im krótsze tym leprze, i mniejsze prawdopodobieństwo zakłóceń (mi się nie zdarzyły).

Tyle w temacie ;)

Pozdrawiam!

Ocena: 4.78/5 (głosów: 9)

Podobne posty

14 komentarzy do “Przyciski dotykowe w kilka minut (Bascom AVR)

  • Bez przesady… To nie jest dedykowany układ qtouch 😉 braknie zegara. Kilka warstw folii to maksimum, ale przy typowym rozwiązaniu to wystarcza.

    Odpowiedz
  • Jednak nie!
    Przy kwarcu 16MHz, i 10 NOP’ach udało się uzyskać zasięg ok 5mm. Z pleksą da rady ;)
    Dla osób które będa konstruować panel dotykowy wedłóg mojego programu, dodam że warto jest odrazu projektować go tak, by był taktowany kwarcem 16MHz. Regulacja czułości ilością NOP’ów jest wtedy znacznie bardziej dokładna.

    Odpowiedz
  • Projekt fajny, ale sorki ze się czepiam… proszę…. popraw błędy ortograficzne tak w artykule jak i w komentarzach. Przynajmniej te najbardziej walące po oczach :P

    Druga sprawa to moje pytanie co do zasady działania… Rozumiem, że ciało człowieka posiada jakiś potencjał magazynowania energii elektrycznej i działa na zasadzie niewielkiego kondensatora. Przy dotyku pin w stanie wysokim “ładuje” ciało jakimś potencjałem energii, a potem przełącza się szybko stan odczytu i sprawdza czy dociera do niego energia z naładowanego “palca-kondensatora”. Jeśli tak to znaczy że był dotyk. Szybkość przełączania reguluje czułość. Dobrze myslę?

    Odpowiedz
  • W moim ostatnim poście faktycznie jest trochę błędów (nie wiem jak go poprawić), ale gdzie widzisz jeszcze jakieś to nie wiem ;)
    Wskaż mi proszę w artykule chodź jeden błąd.

    Jeśli chodzi o Twoje pytanie, to nie chodzi o żadne “ładowanie palca” tylko o zmianę pojemności.

    Odpowiedz
  • Hello!
    I don’t speak your language, but i guess you’ll understand english…
    i just discovered yout program. It works great, i just made a small adjustment regarding output. If metal plate is bigger then output led can flicker sometimes… to eliminate that i inserted a waitms to ignore very short discharges and added a delayed output (led is alias for output, i used tiny13, only one touch):

    If In1 = 1 Then
    Waitms 50
    If In1 = 1 Then
    Led = 1
    Waitms 300
    Led = 0
    End If
    Else
    led = 0
    End If

    Odpowiedz

Odpowiedz

anuluj

Masz uwagi?