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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
"]$regfile = "m32def.dat" $crystal = 8000000 $hwstack = 40 $swstack = 16 $framesize = 32 '=== Wyjścia (LED'y) === Config Pina.4 = Output 'LED1 Config Pina.5 = Output 'LED2 Config Pina.6 = Output 'LED3 Config Pina.7 = Output 'LED4 Config Pina.3 = Output 'LED5 Config Pina.2 = Output 'LED6 Config Pina.1 = Output 'LED7 Config Pina.0 = Output 'LED8 reSet Porta.4 reSet Porta.5 reSet Porta.6 reSet Porta.7 reSet Porta.3 reSet Porta.2 reSet Porta.1 reSet Porta.0 '--------------------------- Dim IN1 As Bit Dim IN2 As bit Dim IN3 As Bit Dim IN4 As bit Dim IN5 As Bit Dim IN6 As bit Dim IN7 As Bit Do Config PortC.0 = Output Reset PortC.0 Waitus 20 Config PortC.0 = Input Set PortC.0 nop : NOP : NOP : NOP IN1 = NOT PinC.0 porta.4 = IN1 Config PortC.1 = Output Reset PortC.1 Waitus 20 Config PortC.1 = Input Set PortC.1 nop : NOP : NOP : NOP IN2 = NOT PinC.1 porta.5 = IN2 Config PortC.2 = Output Reset PortC.2 Waitus 20 Config PortC.2 = Input Set PortC.2 nop : NOP : NOP : NOP IN3 = NOT PinC.2 porta.6 = IN3 Config PortC.3 = Output Reset PortC.3 Waitus 20 Config PortC.3 = Input Set PortC.3 nop : NOP : NOP : NOP IN4 = NOT PinC.3 porta.7 = IN4 Config PortC.4 = Output Reset PortC.4 Waitus 20 Config PortC.4 = Input Set PortC.4 nop : NOP : NOP : NOP IN5 = NOT PinC.4 porta.3 = IN5 Config PortC.5 = Output Reset PortC.5 Waitus 20 Config PortC.5 = Input Set PortC.5 nop : NOP : NOP : NOP IN6 = NOT PinC.5 porta.2 = IN6 Config PortC.6 = Output Reset PortC.6 Waitus 20 Config PortC.6 = Input Set PortC.6 nop : NOP : NOP : NOP IN7 = NOT PinC.6 porta.1 = IN7 Loop End |
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!
To jeszcze jakaś obudowa i będzie fajna zabawka :)
Zrobiłem to tylko do testów. Finalnie będzie tak wykonany panel czołowy pewnego urządzenia ;) i święty spokój z padającymi mikroprzełącznikami.
Jaka jest maksymalna grubość izolacji (materiału) aby poprawnie wykrył dotyk uc?
Czy uc wykryje dotyk spod 5mm szkła czy plexi?
Bez przesady… To nie jest dedykowany układ qtouch 😉 braknie zegara. Kilka warstw folii to maksimum, ale przy typowym rozwiązaniu to wystarcza.
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.
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ę?
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.
Co to są “pule dotykowe”?
“Tylnia” zamiast “tylna”, “leprze” zamiast “lepsze”. :)
będzie fajna zabawka
Planujesz coś ciekawego zrobić ? ;)
“Im krótsze tym leprze”. Nadal nie widzisz błędu?
Poza tym to ciekawy projekt.
Config powinien być na początku programu a nie w pętli
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