. : New eShop! - Mobilní verze - Pandatron.cz - Pandatron.sk - Diskuzní fórum - Zakázkový vývoj : .
 
Realizace dotykových kapacitních tlačítek
13. července 2010 - 8:14 | Vlastimil Krška | Realizace dotykových kapacitních tlačítek | Komentářů: 32  

Realizace dotykových kapacitních tlačítek

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.


Obr. 1: Vývojový programovací kit s obvodem ATmega16

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.


Obr. 2: TSSOP provedení obvodu MPR084

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.


Obr. 3: Obvod MPR084

  • 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.


Obr. 4: Schéma zapojení obvodu MPR084

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.


Obr. 5: Návrh desky s plošnými spoji

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.


Obr. 6: Výsledný projekt dotykových kapacitních tlačítek

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.

Autoři:
Vlastimil Krška, Rostislav Kerber, UREL, FEEC, VUT Brno
xkrska03stud.feec.vutbr.cz, xkerbe00stud.feec.vutbr.cz

Použitá literatura:
[1] Freescale, datasheet pro obvod MPR 084, cit. 22.5.2010

Odkazy & Download:
Freescale Semiconductor
Ústav radioelektroniky
Realizace dotykových kapacitních tlačítek
Projekt ke stažení







GooglePlus1 FaceBook Twitter del.icio.us DiGG Google StumbleUpon Google Buzz Email RSS PDF Tisk

Komentáře (32):

Zobrazit starší 30 dnů (32)...

host
32. Dne 15. 07. 2010 v 20:23 zaslal host
Bez titulku
Ani jeden z anonymnich hostu to ale asi nechape. Ja od zacatku tvrdim ze nejsem vyvojar a tak se nemuzu bat o sve misto. to co jsem prezentoval je konicek.

Proto jak rikam predvedte se, reknete co mam udelat lip, co mam tak zasadne spatne?
Nebo budete jen placat?


Název příspěvku: Vaše jméno: host
                 
  Zakázat formátování [Zakáže kódování a nahrazování smajlíky.]
Připojit soubory
reklama:
Bluetooth modul BTM-112
BTM-112 je snadno dostupný Bluetooth modul výrobce Rayson.
Skladem od 208 Kč

Informace uvedené v článcích jsou platné v době jejich vydání a samotné články jsou určeny pouze jako zdroj informací. Autor článku ani správce webu nenesou žádnou zodpovědnost za případné újmy na majetku a zdraví. Názvy společností a výrobků, loga a další multimediální materiál mohou být ochrannými známkami příslušných společností.
RSS kanály: | |
+420 723 846 377
info@pandatron.cz
Všechna práva vyhrazena | mobilní verze | © Copyright 2000 - 2016 ISSN 1803-6007