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.
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.
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.
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.
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.
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++; //Zvyseni 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.
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.
Vlastimil Krška, Rostislav Kerber, UREL, FEEC, VUT Brno
Komentáře
Obvod by se mi hodil pro 1
Obvod by se mi hodil pro 1 projekt, mel bych 2 dotazy:
Funguji tlacitka spolehlive pres 3mm plexi?
Kde a za kolik kupujete MPR084?
Dobrý den, shodou okolnosti
Dobrý den, shodou okolnosti jsem spoluautorem tohoto projektu a proto Vám mohu odpovědět za kolegu Kržky. Bohužel pro Vás asi nebudu mít nejlepší odpovědi, protože jsme tlačítka měli přelepená pouze obyčejnou průhlednou lepící páskou a nic silnějšího jsme nezkoušely. Můj osobní tip je že 3 mm už je příliž. A co se týče dostupnosti MPR084 týče, tak ten byl získán od firmy Freescale jako vzorek pro studium. Tento projekt byl totiž zpracován při studiu na vysoké škole. Nicméně od kolegů jsem se dozvěděl, že vzorky obvodů Freescale zasílá i soukromím osobám. Platí se tuším jen nějaká administrativní částka za položku, ale tohle si už budete muset zjistit přímo od firmy Freescale.
Hodně zdaru R. Kerber
Zkušenost
Pokud je obvod samostatně(klávesnice má maximálně 8 tlačítek) pak funguje spolehlivě a pokud se navrhne dobře motiv, pak si myslím, že by i 3mm neměl být velký problém. Víc napoví AN příslušného obvodu. Zkoušel jsem to s cca 1.5mm tlustým plastem před klávesnicí a fungovalo to. Jinak tento obvod je momentálně asi nejdostupnější ve Farnell za cca 60Kč. U Freescalu chtělí $11 (214Kč) + doprava.
RE: Realizace dotykových kapacitních tlačítek
Nevidim dovod experimentovat s externymi obvodmi, ked nove AVR s PicoPower /napr. ATtiny45-85 a vyssie/ podporuju metodu QTouch(R). Skuste pozriet stranky Atmelu pre blizsie info
http://www.atmel.com/products/bsw/default.asp?family_id=697
RE: Realizace dotykových kapacitních tlačítek
na 3mm plexisklo pouzivam QT1080 - taktéž 8 kanalu, je o trosku víc toho balastu okolo. zase se ale dá vyladit na velmi rychle odezvy i pres takhle tluste plexi. Doporucuji take pouziti konicke pruzinky - je pak mozne ze zapajeneho pinu pres konickou pruzinku prevest signal na plexi - neni navic temer zadna vzduchova mezera.