
Berührungssensor
und programmierbarer Pullup mit ATtiny85
Elektronik-Labor
Projekte
AVR
Tiny85
Ziel
der Entwicklung waren sensitive Berührungsfelder für eine automatische
Morsetaste. Im ersten Versuch wollte ich es mit zwei Piezoscheiben
versuchen, deren Spannung bei Berührung abgefragt wird. Das ist
allerdings daran gescheitert, dass die Piezoscheibe genauso empfindlich
auf eine Temperaturänderung reagiert wie auf eine Verbiegung.
Im
zweiten Ansatz wurden Berührungskontakte getestet, die auf den
Hautwiderstand reagieren. Der zweiseitige Sensor wurde aus
Streifenrasterplatinen gebaut. Jeder zweite Streifen liegt an
GND. Außerdem wurde jeder der beiden Sensoren mit einem
Kondensator von 330 pF überbrückt.
Der
Hautwiderstand kann je nach Kontaktfläche und Hautfeuchtigkeit irgendwo
zwischen 10 k und 1 M liegen und sich laufend verändern. Man braucht
eigentlich einen einstellbaren Pullup-Widerstand, um die optimale
Empfindlichkeit des Sensors einzustellen. Beim Tiny85-IR-Detektor
wurde
bereits ein Widerstand von 500 MOhm "programmiert". Hier wurde eine
Methode gesucht, Widerstände im Bereich 1 MOhm zur programmieren.
Programmierbare
Widerstände sind in Zusammenhang mit den mittelnden Kondensatoren
machbar. Dazu werden die analogen Eingange A2 und A3 in einer
Interruptroutine mit einer Frequenz von 4 kHz abgefragt.
Zusätzlich wird jedes Mal für wenige µs der interne Pullup von ca. 35 k
eingeschaltet. Im Mittel erhält man damit einen wesentlich größeren
Pullup, der über die Verzögerungszeit justiert werden kann. Bei einer
Verzögerung von 5 µs kommt man effektiv auf rund 1,3 M.
'ELBug.bas, Touch-Sensoren mit programmierten Pullups
$regfile = "attiny85.dat"
$crystal = 8000000
$hwstack = 8
$swstack = 4
$framesize = 4
Dim D As Word
Dim N As Word
Dim Key As Byte
Open "comb.1:9600,8,n,1" For Output As #1
Config Adc = Single , Prescaler = Auto
Config Timer0 = Pwm , Prescale = 8 , Compare A Pwm = Clear_up
Config Timer1 = Timer , Prescale = 64
Pwm0a = 0
On Timer1 Tim0isr
Enable Timer1
Enable Interrupts
Do
If Key.0 = 1 Then
Pwm0a = 128
Waitms 100
Pwm0a = 0
Waitms 100
End If
If Key.1 = 1 Then
Pwm0a = 128
Waitms 300
Pwm0a = 0
Waitms 100
End If
Loop
'1/(8 MHz / 8 / 256) = 256 µs. ca 4 kHz
Tim0isr:
D = Getadc(2)
If D < 100 Then Key.0 = 1 Else Key.0 = 0
D = Getadc(3)
If D < 100 Then Key.1 = 1 Else Key.1 = 0
Portb.4 = 1
Portb.3 = 1 'Pullup ca. 35 k
Waitus 5 'Einschaltdauer ca. 6/µs pro 246 µs = 1 /37
Portb.4 = 0
Portb.3 = 0 'Pullup effektiv 35k * 42 = 1,3 M
Return
End
Am
Ende hat sich übrigens auch diese Methode als ungünstig erwiesen. Die
Eigenschaften der Berührungskontakte ändern sich bei lang andauerndem
Betrieb, und auch die Finger sind immer wieder anders. Man muss deshalb
mal fester oder wieder weniger fest drücken, was für eine Morsetaste
nicht tolerierbar ist. Außerdem müssten die Kontakte regelmäßig
gesäubert werden. Besser wäre ein rein kapazitiv arbeitender Sensor.
Was aber von diesem Versuch übrig geblieben ist, sind die
programmierbaren Widerstände, die auch für andere Aufgaben in der
Messtechnik nützlich werden können.
Siehe auch: Capacitive Touch Sensor based morse key
Elektronik-Labor
Projekte
AVR
Tiny85