Realizace dotykových kapacitních tlačítek

Vlastimil Krška, Rostislav Kerber, UREL, FEEC, VUT Brno
xkrska03stud.feec.vutbr.cz, xkerbe00stud.feec.vutbr.cz
projekt zveřejněn také na www.pandatron.cz a www.hw.cz

Obsah:

  1. Úvod
  2. Realizace
  3. Závěr
  4. Literatura

Úvod

Cílem tohoto projektu je využít obvod firmy Freescale k realizaci dotykových kapacitních tlačítek. Obvod MPR 084 je senzorový kontroler určený právě pro snímání dotekových kapacitních tlačítek.
Během projektu bude navrženo obvodové uspořádání, jeho realizace a návrh programového ovládání pomocí AVR kitu s kontrolerem ATmega16. Výsledkem projektu bude model schopný detekce
stisku tlačítka a jeho vypsání na znakový display.

Realizace

Tento projekt bude realizován na vývojovém programovacím kitu s mikrokontrolerem ATmega16, který je zobrazen na následujícím obrázku. Veškeré programové ovládání je tedy testováno na tomto kitu.

Logo ústavu

Pro návrh obvodového uspořádání byly použity doporučení uvedená v datasheetu obvodu[1]. Firma Freescale vyrábí tyto obvody se dvěma pouzdry. V našem případě byl použit model s pouzdrem TSSOP.

Logo ústavu

Tento obvod pracující s napájecím napětím 1,8V až 3,6V při provozních teplotách -40°C až +85°C pracuje na principu zjišťování údálosti na tlačítkách. Při detekci této události (eventu) se generuje
signál přerušení pro spuštění obslužného programu. Obvod MPR 084 pracuje se sběrnicí I2C a pomocí této komunikace také posílá data pro zpracovávání událostí zjištěných na tlačítkách.
Na následujícím obrázku je detailní zobrazení pinů obvodu i s jejich popisky.

Logo ústavu
ATTN - Vstupní pin povoluje při nastavené nízké úrovni komunikaci s obvodem.
IRQ - Výstupní pin, který se při zachycení nové události obvodem nastaví na nízkou úroveň. Zdroj pro externí přerušení.
VDD - Napájecí napětí.
VSS - Zem.
SCL - Hodinový signál pro I2C komunikaci.
SDA - Data pro I2C komunikaci.
AD0 - Pin pro adresaci součástky.Adresa pro zápis je 0x5C a pro čtení je 0x5D.
SOUNDER - Push-pull výstupní pin pro piezo reproduktor. Zvuková signalizace stisku tlačítka.
E1 až E8 - Piny pro připojení kapacitních dotykových tlačítek.

Logo ústavu
Základní schéma zapojení bylo převzato z [1]. AVR Kit ovšem pracuje s provozním napětím 5V a proto bylo nutné toto schéma doplnit o část, která se postará o snížení napájecího napětí na hodnotu v rozmezí 1,8V až 3,6V.
Toho bylo docíleno seriovým předřazením tří diod 1N4148, které základní napětí 5V snížilo pod kritickou hodnotu 3,6V a to na hodnotu 3,3V.
Logo ústavu
Na obrázku výše je zobrazen layout plošného spoje z pohledu ze strany součástek. Pro pohled ze strany SMD je nutné jej zrcadlit. Obvod IO1 představuje samozřejmě obvod MPR 084. Odpory R1 až R8 představují
dle schématu odpory 780kΩ. Odpor R9 odpovídá odporu 4,7kΩ připojenému na pin IRQ. Zbývají součástky R10 až R12 představují výše zmíněné usměrňovací diody typu 1N4148. Červené propojky v návrhu
představují drátěné propojky. Na levé straně je zobrazena lišta KD pro usazení do patice AVR Kitu.

Protože je I2C komunikace mimo aktivní provoz primárně na vysoké úrovni, je nutné piny SCL a SDA připojit na pull-up rezistory. Při psaní obslužných programů se nejprve předpokládalo s použitím vnitřních softwarových
pull-up rezistorů avšak poté bylo přistoupeno k použítí skutečných rezistorů s hodnotou 2,7kΩ, kterými se dodatečně připojilo napájecí napětí na tyto piny. V obrázku layoutu však tato dodatečná úprava není zakreslena.
Podle všech informací by však použití vnitřních softwarových rezistoru mělo odvést stejně dobrou práci. Poslední úprava, která není ve schématu ani v návrhu layoutu zakreslena je vyvedení pinu IRQ na z našeho pohledu
třetí vývod KD lišty od spodu. Zde je totiž v AVR kitu připojen vstup pro přívod zdroje signálu externího přerušení. Použití externího zdroje přerušení se totiž zavedlo až v průběhu práce.

Zdrojový kód z hlavní smyčky programu (tlacitka.c):

   #include <avr/io.h>
   #include <avr/interrupt.h> 			//knihovna pro preruseni
   #include "lcd_c.c" 				//knihovna pro inicializaci znakoveho LCD
   #include "twimaster.c" 			//knihovna pro ovladani i2c komunikace (spolu s knihovnou i2cmaster.h )
   #include <util/delay.h> 			//knhovna pro zavadeni zpozdeni
   #include "C_touch.c" 			//knihovna pro inicializaci obvodu a vycitani cisla tlacitka (spolu s knihovnou C_touch.h)
ISR(INT0_vect)					//preruseni z externiho zdroje (z pinu IRQ)
 {
   unsigned char hodnoty [2];
   unsigned char buffer [20];
   
   Test_touch();				//vycitani hodnot stisknutych tlacitek a oprava chyby obvodu (popsano v C_touch.c)
   lcd_gotoxy(0,0);				//pozice pro vypis na LCD
   sprintf(hodnoty,"%02x",Cislo_tl[0]);		//prevod znaku na cislo
   lcd_puts (hodnoty);				//vypsani cisla stisknuteho tlacitka na LCD
 }
int main (void)							
 {
   unsigned char buffer [20];
   unsigned char hodnoty [2];
   unsigned char x = 0;
   Cislo_tl[9]=0;
   lcd_init();					//inicializace LCD
   DDRC = 0b00000100;				//zde se nastavuje I/O rezim a take se zde povoluji vyse zminene pull-up rezistory
   PORTC =0b00000000;
   i2c_init();					//inicializace I2C komunikace
   Touch_init();				//volani funkce Touch_init, ktera je umistena v C_touch.c a provadi reset MPR 084 a nastaveni jeho registru
   
   MCUCR=(1<<ISC01);				//nastaveni preruseni INT0 na sestupnou hranu
   GICR=(1<<INT0);				//nastaveni povoleni externiho preruseni
   _delay_ms(50);				//zpozdeni 50ms
   sei();					//globalni povoleni preruseni
   while (1);
 }


Výsek zdrojového kódu funkcí Touch_init() a Test_touch(),(C_touch.c):
void Touch_init(void) { i2c_start_wait(Tlacitka+I2C_WRITE); i2c_write(0x13); i2c_write(0x04); //Deaktivace a reset obvodu i2c_stop();
/*Nastaveni registru obvosu MPR084*/ 
   i2c_start_wait(Tlacitka+I2C_WRITE); 
   i2c_write(0x03);
   i2c_write(0x99);										//Touch Pad Configuration Register
   i2c_write(0x09);										//Sensitivity Threshold Registers 0
   i2c_write(0x09);										//Sensitivity Threshold Registers 1
   i2c_write(0x09);										//Sensitivity Threshold Registers 2
   i2c_write(0x09);										//Sensitivity Threshold Registers 3
   i2c_write(0x09);										//Sensitivity Threshold Registers 4
   i2c_write(0x09);										//Sensitivity Threshold Registers 5
   i2c_write(0x09);										//Sensitivity Threshold Registers 6
   i2c_write(0x09);										//Sensitivity Threshold Registers 7
   i2c_write(0xFF);										//Electrode Channel Enable Mask Register
   i2c_write(0x01);										//Maximum Number of Touched Positions Register
   i2c_write(0x05);										//Master Tick Period Register
   i2c_write(0x01);										//Touch Acquisition Sample Period Register
   i2c_write(0x07);										//Sounder Configuration Register
   i2c_write(0x00);										//Low Power Configuration Register
   i2c_write(0x00);										//Stuck Key Timeout Register
   i2c_write(0xF7);										//Configuration Register
   i2c_stop();
}

void Test_touch(void)
{
unsigned char hodnota=0,error=0,i=0;

while(hodnota != 0x40) //Cekani vyprazdneni registru
{
i2c_start_wait(Tlacitka+I2C_WRITE); //Adresace registru se stisknutou hodnotou
i2c_write(0x00);
i2c_start_wait(Tlacitka+I2C_READ); //Vycteni aktualniho stisku
hodnota = i2c_readNak();
i2c_stop();

i2c_start_wait(Tlacitka+I2C_WRITE); //Adresace chyboveho registru
i2c_write(0x01);
i2c_start_wait(Tlacitka+I2C_READ); //Vycteni chyby
error = i2c_readNak();
i2c_stop();
if(error != 0) //Test chyby obvodu
{
Touch_init(); //Reset obvodu a opetovna inicializace
goto Konec; // Uknceni vycitani
}

Cislo_tl[i] = (hodnota & 0x0F) + 1; //Zapis stisknute hodnoty tlacitka
hodnota &= 0xF0; //Maskovani stisku - vyuziti priznaku
i++; //Zviseni hodnoty bufferu vycitanych hodnot
}

Další uživatelsky důležitým souborem je knihovna C_touch.h. V této knihovně se totiž nastavuje adresa obvodu pro I2C komunikaci. Tuto hodnotu je nuné zjistit v Datasheetu použitého obvodu a zapsat ji sem bitově
posunutou o jeden bit doleva. Pro obvod je tato adresa adresou pro čtení, tedy 0x5D. Převedeno na binární soustavu 0b01011101. Bitově posunuto se pak bude jednat o číslo 0b10111010, tedy 0xBA hexadecimálně.
Program je schopen zpracovat oba druhy zápisu. Viz následující čás kódu z knihovny C_touch.h.

#define Tlacitka 0b10111010 			//I2C adresa obvodu MPR 0x5D tedy, 0b01011101

Na konec se pro zabránění náhodnému spojování kontaktů dotykové plošky přelepily lepící páskou, která má dostatečné izolační vlastnosti.
Logo ústavu Logo ústavu

Závěr

Projekt nakonec došel do zdárného konce. Veškeré požadované vlastnosti návrhu byly zcela zplněny a obvod pracoval velmi kvalitně. Návrh by bylo možno doladit použitím softwarových pull-up rezistorů a korektním
vyvedením pinu IRQ. Jako případné rozšíření by se mohlo realizovat například ovládání elektronického zámku pro domovní dveře. Jako zvláštní poděkování je nutné zde zmínit jména lidí, které také měli svůj podíl na úspěšném
dokončení projektu. Jmenovitě to byli Ing. Zbyněk Fedra, Ph.D. a Bc. Martin Králíček. Na závěr je přiložen odkaz na stáhnutí projektu.

Literatura

[1] Freescale, datasheet pro obvod MPR 084, cit. 22.5.2010, WWW:
&WT_TYPE=Data%20Sheets&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation