Berührungssensor und programmierbarer Pullup mit ATtiny85    


Elektronik-Labor   Projekte   AVR  Tiny85




Lernpaket Mikrocontroller

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.


Elektronik-Labor   Projekte   AVR  Tiny85