Jste zde

Realizace dotykových kapacitních tlačítek

avr.jpg

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.

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

PřílohaVelikost
Soubor projekt.tlacitka.rar36.82 KB
Hodnocení článku: 

Komentáře

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

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.

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.