Forum: Mikrocontroller und Digitale Elektronik TinyTouchLib - Touchbutton library für Attiny


von Tim  . (cpldcpu)


Lesenswert?

Hallo zusammen,

nach vielen Experimenten mit diversen Ansteuertechniken für kapazitive 
Touchbuttons habe ich eine kleine Library geschrieben, welche die 
Auswertung eines Touchbuttons auf ATtiny MCUs unterstützt. Dabei habe 
ich eine Methode implementiert,  welche einen Spannungsteiler mit dem 
internen S&H Kondensator zur Auswertung der Padkapazität nutzt und 
dadurch ohne externe Komponenten auskommt (Analog Qtouch ADC von Atmel). 
Im Gegensatz zur Lib von Atmel funktioniert diese Library auch auf den 
kleinen ATtinys wie ATtiny 5 und 10.

Vielleicht ist es ja für jemanden von Nutzen. Über Bugreports und 
Feedback würde ich mich freuen.

https://github.com/cpldcpu/TinyTouchLib

von kobe rind (Gast)


Lesenswert?

sehr schön! wenn du eventuell noch eine schaltung als pdf oder jpg 
dazugeben könntest wäre das ganz toll!

von Tim  . (cpldcpu)


Lesenswert?

Gerne. Der Trick ist eigentlich, dass man gar keine Schaltung braucht, 
sondern das Pad einfach an einen Pin angeschlossen werden kann. Ich habe 
aber eine Testapplikation, welche ich auch online stellen werde.

von Tim  . (cpldcpu)


Angehängte Dateien:

Lesenswert?

So, hier ist ein kleines Projekt, welches die Library auf einem ATtiny10 
nutzt, um 4 WS2812 LEDs zu kontrollieren. Der Witz an der Sache ist, 
dass nur zwei Pins des Controllers benötigt werden.

https://github.com/cpldcpu/TinyTouchButton

von Stefan (Gast)


Lesenswert?

Sehr interessant, Danke!
Sag mal siehst Du eine Möglichkeit an denselben Touch pin auch eine LED 
dranzuhängen so wie Semtech das macht? Ich hab keine Ahnung wie stabil 
Semtech's Lösung ist, aber ich hab das sonst bei keinem anderen 
Hersteller gesehen.
http://www.semtech.com/touch-interface/capacitive-touch-controllers/sx9513/
unter Diagrams/Specs

von Tim  . (cpldcpu)


Lesenswert?

> Sehr interessant, Danke!
> Sag mal siehst Du eine Möglichkeit an denselben Touch pin auch eine LED
> dranzuhängen so wie Semtech das macht? Ich hab keine Ahnung wie stabil
> Semtech's Lösung ist, aber ich hab das sonst bei keinem anderen
> Hersteller gesehen.

Das sollte eigentlich kein Problem sein. Allerdings muss die Kathode der 
LED dann auch an einen MCU-Pins angeschlossen werden, den man floaten 
lässt während das Touchpad ausgelesen wird.

von Tim  . (cpldcpu)


Lesenswert?

Lustig, außer hier habe ich von dem TinyTouchButton nirgendwo etwas 
erwähnt. Irgendwie hat sich da etwas verselbstständigt?

http://www.adafruit.com/blog/2013/06/17/tiny-touch-button/

uvm...

von Tim  . (cpldcpu)


Lesenswert?

Es gibt jetzt eine Hardware V2.0!

https://github.com/cpldcpu/TinyTouchButton

von Tim  . (cpldcpu)


Angehängte Dateien:

Lesenswert?

Bild der V2.

Die V2 Platine kam von OSH-Park. Die V1 ist von der Sammelbestellung von 
Jakob aus dem "Markt"-Brett.

von Tim  . (cpldcpu)


Lesenswert?

Und hier in Aktion, Wahnsinn!!

http://www.youtube.com/watch?v=yGvvy51Po7Q

von K. D. (deka)


Lesenswert?

Tim .  schrieb:
> Und hier in Aktion, Wahnsinn!!

Waaaaaaaaaaaaahnsinn eine LED leuchtet !!!

von Tim  . (cpldcpu)


Lesenswert?

>
> Waaaaaaaaaaaaahnsinn eine LED leuchtet !!!

Zwei! Du hast etwas übersehen!

von Axel S. (a-za-z0-9)


Angehängte Dateien:

Lesenswert?

Tim  . schrieb:
> Vielleicht ist es ja für jemanden von Nutzen. Über Bugreports und
> Feedback würde ich mich freuen.

Ja, ist von Nutzen. Und hier auch gleich ein Bugreport:

1
uint8_t tinytouch_adc(void) {
2
3
    uint8_t dat1,dat2;
4
...
5
    return dat2 - dat1;
6
}

Bei der Subtraktion kann es zu einem Überlauf kommen. Dann spinnt die 
ganze Logik dahinter. Nicht gut :(

Im Detail:

Das Prinzip besteht darin, den S/H Kondenstaor im ADC einmal auf Vcc 
vorzuladen und die Touchfläche auf GND. Dann werden beide zusammen- 
geschaltet, die resultierende Spannung gemessen und in dat1 abgelegt.

Dann nochmal anders herum; Touchfläche auf Vcc, S/H auf GND und das 
Meßergebnis in dat2 ablegen.

Wäre die Kapazität der Sensorfläche 0 und gäbe es auch sonst keine 
parasitären Kapazitäten, dann würde die erste Messung 0xFF liefern und 
die zweite 0. Je größer die Kapazität der Sensorfläche, desto niedrigere 
Werte liefert die erste Messung und desto höhere die zweite. Wenn man 
nun eine recht große Sensorfläche hat, dann kann es sein, daß der erste 
Meßwert absolut kleiner wird als der zweite und die Subtraktion läuft 
über.

Die Abhilfe ist einfach: für die erste Messung ist (255-dat1) ein Maß 
für die Kapazität der Sensorfläche. Für die zweite ist dat2 direkt 
dieses Maß. Das Ergebnis muß also nicht (dat2-dat1) sein, sondern 
(255-dat1 + dat2). Genau so setzt mein angehängter Patch das um. Da 
tinytouch_adc() nun auch Werte über 255 zurückliefern kann, muß uint16_t 
verwendet werden. Und in tinytouch_sense() kann man nicht mehr mit um 8 
nach links geshifteten Meßwerten in bias & Co rechnen, sondern darf nur 
noch 7 Bits nach links schieben.

Die zweite Änderung betrifft die Wartezeit für das Vorladen der 
Sensorfläche. Die hast du fest mit 32µs in den Code geschrieben. Ich 
habe dafür ein neues #define in TinyTouchLib.h eingefügt.

Die derart geänderte Version von TinyTouchlib tut sehr gut in meinem 
jüngsten Projekt. Siehe Beitrag "Touchdimmer mit ATtiny13"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.