Bonjour,
avec un microcontroleur du genre AT tiny de chez ATMEL, ou bien un quelconque PIC ou encore un MSP430, il est très facile d'implémenter des touches sensitives par effet capacitif.
Comment ça marche ?
;la touche sensitive ? deux surfaces de 3x3 cm, en vis à vis de part et d'autre d'un CI époxy double face.Code:; VCC ; | ; | ; _ ; | | ; R | | 2.2M ; | | ; T ; | || ; _ | || ; PINy(x) _/ <-------+-----------|| touche sensitive : Cts ~ 25 pF ; | || ; | || ; _____ ; capacité parasite _____ Cp ~ 5 pF ; | ; | ; ___ ; ////
Avec les caractéristiques de permitivité de l'époxy "FR4", on arrive à une capacité de l'ordre de 25 pF.
lorsqu'on ne touche pas la surface cuivrée , la capacité Ce vue sur l'entrée PINy(x) vaut : Ce = Cp = 5 pF
lorsqu'on touche la surface cuivrée la capacité Ce vue sur l'entrée PINy(x) vaut : Ce = CP + Cts = 30 pF
En partant d'un tension de 0V, la tension sur PINy(x) va monter jusqu'à VCC selon une constante de temps T = RC (0,63 VCC au bout de T, ce qui est proche du seuil de basculement de 0 à 1 qui vaut 0,7 VCC)
on calcule les deux temps : Tp = R x Cp = 11 µs quand on ne touche pas le cuivre,
Tts = R x (Cp + Cts) = 66 µs quand on touche le cuivre.
et on voit qu'en scrutant l'entrée PINy(x) au bout d'un délai intermédiaire (40 µs par exemple)
dans le premier cas (où l'on ne touche pas le cuivre) elle sera à 1
dans le deuxième cas (où l'on touche le cuivre), elle sera à 0 !
D'où le "driver" pour touches sensitives :
bascule la PINy(x) en sortie
force la PINy(x) à 0
bascule PINy(x) en entrée
TopChrono:
goto TopChrono tant que T < 40 µs
lit PINy(x)
inverse l'état du bit
Fin:
On ne peut plus simple !
Evidemment on peut scruter un port complet, c'est-à-dire scruter l'état de 8 touches capacitives à la fois, sans multiplexage.
après un essai effectué sur ATtiny2313, j'ai implémenté deux touches sensitives "+" et "-" sur un montage définitif utilisant un ATtiny461, et ça a marché du premier coup !
Pour un ATtiny ATMEL, voilà à quoi ressemble le listing de programmation :
Code:; Name: AVR_CAP_KEY.avr ; Title: capacitive keys driver ; Version: 1.0 ; Last updated: 2011.09.05 ; Target: ATtiny 1 MHz, up to 16 MHz ;START COPY TO CONFIG FILE ;#######################; ; GENERAL SETTING ; ;#######################; ;.set FREQUENCY = 1 ; MHz ;------------------------------------; ;---------------------------------------; ; AVR CAP_KEY I/O usage ; ;---------------------------------------; ;.equ PORT_CAP_KEY = PORTX ; ;.equ DDR_CAP_KEY = DDRX ; ;.equ INPUT_CAP_KEY = PINX ; ;.equ PLUS_CAP = y ; PLUS KEY ;.equ MINUS_CAP = z ; MINUS KEY ;.equ ZZZ_CAP = ... ; and so on, up to 8 keys ;---------------------------------------; ;---------------------------------------; ; AVR CAP_KEY registers usage ; ;---------------------------------------; ;.def rTEMP1 = r.. (16-23); ;.def rPARAM = r.. (16-23); ;---------------------------------------; ;---------------------------------------; ; AVR CAP_KEY Declarations ; ;---------------------------------------; ;.equ CAPKEYDISCRI = int(40*FREQUENCY/3); tempo de 40 µs ;.equ CAPKEYSET = (1<<PLUS_CAP)|(1<<MINUS_CAP); up to 8 keys ;---------------------------------------; ;STOP COPY TO CONFIG FILE ;---------------------------------------; CapKeyScan: ; ;---------------------------------------; ; in : ; use : rTEMP1, rPARAM ; out : rPARAM ; rPARAM = 0 and SREG bit Z=1 if no touch in rTEMP1, OUT_CAP_KEY ; cbr rTEMP1, CAPKEYSET ; set PORT CAPKEY bits in low state (cbr=bitwise nand) out OUT_CAP_KEY, rTEMP1 ; and to disable the pull up resistor on CAPKEY inputs ! in rTEMP1, DDR_CAP_KEY ; load DDR CAPKEY sbr rTEMP1, CAPKEYSET ; then configure CAP KEY bits as output (sbr=bitwise or) out DDR_CAP_KEY, rTEMP1 ; to discharge CAP KEY inputs capacitance in rTEMP1, DDR_CAP_KEY ; load DDR CAPKEY cbr rTEMP1, CAPKEYSET ; then configure CAP KEY bits as input (cbr=bitwise nand) out DDR_CAP_KEY, rTEMP1 ; and wait... ldi rTEMP1, CAPKEYDISCRI ; CapKeyScanLoop: ; duration loop in µs = 3 cycles / MHz dec rTEMP1 ; decrement loop count brne CapKeyScanLoop ; loop while count <> 0 ldi rPARAM, CAPKEYSET ; rPARAM = 0b00001100, for example in rTEMP1, INPUT_CAP_KEY ; rTEMP1 = 0bxxxxxxxx and rTEMP1, rPARAM ; rTEMP1 = 0b0000xx00 eor rPARAM, rTEMP1 ; rPARAM = 0b0000yy00, x bits are inverted ( y = 1 - x ) ret ; ;-------------------------------------;
-----