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.
Visual Basic
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
'---------------------------
DimIN1 AsBit
DimIN2 Asbit
DimIN3 AsBit
DimIN4 Asbit
DimIN5 AsBit
DimIN6 Asbit
DimIN7 AsBit
Do
Config PortC.0=Output
Reset PortC.0
Waitus20
Config PortC.0=Input
SetPortC.0
nop:NOP:NOP:NOP
IN1=NOTPinC.0
porta.4=IN1
Config PortC.1=Output
Reset PortC.1
Waitus20
Config PortC.1=Input
SetPortC.1
nop:NOP:NOP:NOP
IN2=NOTPinC.1
porta.5=IN2
Config PortC.2=Output
Reset PortC.2
Waitus20
Config PortC.2=Input
SetPortC.2
nop:NOP:NOP:NOP
IN3=NOTPinC.2
porta.6=IN3
Config PortC.3=Output
Reset PortC.3
Waitus20
Config PortC.3=Input
SetPortC.3
nop:NOP:NOP:NOP
IN4=NOTPinC.3
porta.7=IN4
Config PortC.4=Output
Reset PortC.4
Waitus20
Config PortC.4=Input
SetPortC.4
nop:NOP:NOP:NOP
IN5=NOTPinC.4
porta.3=IN5
Config PortC.5=Output
Reset PortC.5
Waitus20
Config PortC.5=Input
SetPortC.5
nop:NOP:NOP:NOP
IN6=NOTPinC.5
porta.2=IN6
Config PortC.6=Output
Reset PortC.6
Waitus20
Config PortC.6=Input
SetPortC.6
nop:NOP:NOP:NOP
IN7=NOTPinC.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).
Wyłączniki różnicowoprądowe, potocznie nazywane różnicówkami, odgrywają kluczową rolę w zapewnieniu bezpieczeństwa instalacji elektrycznych. Ich głównym…
14 komentarzy do “Przyciski dotykowe w kilka minut (Bascom AVR)”
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.
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
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