Jste zde

Domácí automatizace II

automIII.png

V minulém, úvodním, díle Domácí automatizace jsme si stručně uvedli, které technologie budeme pro vývoj našich inteligentních systémů pro řízení domácnosti využívat. Jednou z nich byly i produkty z rodiny IQRF. Protože se v této oblasti lecos za poslední měsíce změnilo, bylo by vhodné si říci, jaké inovace nám výrobce připravil.

V uplynulých posledních dvou letech měli čtenáři HW.cz pravidelně možnost sledovat sérii článků zaměřený právě na tuto technologii. Od vydání posledního z nich na toto téma, ale uplynulo už několik měsíců a přesto, že byly v jiných souvislostech zmiňovány novinky ohledně modulů IQRF, nebyla na toto téma publikována žádná praktická konstrukce.

Před dvěma lety, kdy série článků pod názvem „IQRF prakticky“ začínala, byl hlavním želízkem v ohni modul pod označením TR-21A. Přestože se nejednalo o špatný produkt, přišla řada vylepšení, k nimž patří například záměna procesoru za typ PIC16F886, s tím související rozšíření uživatelsky využitelné paměti, rozšíření prostoru pro aplikace a systémové funkce, snížená spotřeba a mnoho dalších. Světlo světa spatřil typ TR-31B. Mezi další inovace, které vypuštění nového typu přineslo, lze započítat i přidání další uživatelsky ovládané LED, rozšíření počtu IO portů a zvýšení odolnosti proti rušení.


Obrázek 1: Moduly řady TR-31B

I přes některé nesporné výhody dalšího modulu v pořadí TR-52B, který si představíme záhy, je typ TR-31B jistě vhodnou variantou jak s malými nároky na energii, realizovat inteligentní bezdrátové ovládání, nebo jednodušší pojítko. Přestože nedisponuje takovým dosahem jako typ TR-52B, jeho velkou předností je velmi nízká spotřeba při vysílání a ve standardním RX módu.

Zvyšujeme dosah

Přestože nové vlastnosti typu TR-31B znamenaly jistý pokrok oproti předchozí verzi, neusnuli vývojáři v Jičínském MICRORISCu na vavřínech a zahájili vývoj na novém a řekl bych velmi povedeném typu TR-52B. Tento modul, na rozdíl od ostatních již nevyužívá klasického kovového RF obvodu s amplitudovou modulací, ale zcela jiný obvod od téhož výrobce, tentokrát již s modulací frekvenční. Tímto zásahem se podařilo zvýšit celkový dosah modulu, který se podle informací v katalogovém listu pohybuje ve volném prostoru až 500m/19.2kbps, (700m/1.2kbps)!. Jistou daní za takový výkon je spotřeba modulu a to jak v TX i RX módu. V MICRORISCu ale operativně implementovali tři režimy vysílání a příjmu lišících se způsobem tvorby RF paketů a také samozřejmě ve v metodě jejich příjmu. V některých případech je tak možné snížit spotřebu v RX módu až na 0,6mA, což ovšem znamená natažení paketu ve vysílači a tím také větší spotřebu v této části komunikačního řetězce. Je pak zcela na vývojáři jaký režim zvolí v závislosti na konkrétní aplikaci. Nicméně možnost této volby je velmi zajímavá.


Obrázek 2: Možnosti při výběru připojení antén

Pro další práci s moduly IQRF v našem miniseriálu předpokládám, že čtenář vlastní programátor CK-USB-02, případně levnější a pro naše účely zcela dostačující CK-USB-03. Dále předpokládám využití modulů TR-52B. To ovšem neznamená, že by nebylo možné použít jiné moduly, ovšem v některých případech bude nutné upravit uživatelskou aplikaci tak, aby odpovídala aktuální verzi vývojových prostředků pro daný typ modulu a samozřejmě také aktuální verzi operačního systému.

Přesto, pokud nevlastníte ani jeden z uvedených produktů, a nehodláte si je ani pořizovat, neznamená to, že „Domácí automatizace“ pro Vás končí. Zařízení, která budeme konstruovat s moduly IQRF lze samozřejmě vytvořit i s produkty jiných značek.

Inteligentní automatický spínač

Prvním projektem, který si na modulech IQRF vystavíme, bude inteligentní automatický spínač. Bude se jednat o zařízení umožňující spínat dva spotřebiče (galvanicky oddělené spínače). Zařízení budou spínána dle kalendáře, který bude obsahovat dva nezávislé programy pro dny pondělí-pátek a sobota-neděle. Pro přesné měření času využijeme externí obvod RTC. Externí EEPROM připojovat nebudeme, protože TR-52B nám poskytuje 160B uživatelských dat, v případě, kdy modul nepracuje jako koordinátor. Uvedené vlastnosti si shrneme:

  • Napájení v rozsahu 12-15V (síťový adaptér).
  • Dva denní programy (pondělí-pátek, sobota-neděle).
  • Denní program se šesti časovými značkami.
  • Dva galvanicky oddělené spínače.
  • Možnost manuálního ovládání spínačů lokálně i dálkově.
  • RTC DS1307 (I2C).
  • Programování prostřednictvím bezdrátového spojení. (Vlastní aplikace pro OS Windows).

U výše popsaného zařízení není třeba uvažovat o nutnosti zálohovat jeho činnost zálohovaným zdrojem nebo bateriemi. Vzhledem k tomu, že ve většině případů budeme spínat jiné síťové zařízení, postrádala by tato snaha smysl. Modifikací uživatelské aplikace založené na stejném HW je pak možné vytvořit relativně komfortní termostat s čidly teploty rozmístěnými po bytě či domě. Relé pak spíná řídící signál z kotle.

V dnešním díle si nebudeme práci komplikovat, jistě je zde mnoho lidí, kteří s IQRF zatím nic nevytvořili. My se tedy prozatím pustíme do jednoduchého ovladače pro manuální řízení dvou relé. Jako přijímač nám bude sloužit samostatný modul IQRF TR-52. Ten stačí po naprogramování připojit pouze na napájení, protože činnost relé si budeme „simulovat“ na dvou LED, které modul obsahuje. Lepší variantou je použití modulu DK-EVAL-3 (viz obrázek dole), popřípadě vývojové desky z kitu DK-31BA. Dálkový ovladač je možné si vytvořit vlastními silami, nebo použít hotový RC-03 (vše k shlédnutí na www.iqrf.org, nebo HW shopu.


Obrázek 3: DK-EVAL-3

Začněme ovladačem

Předpokládám, že ne všichni čtenáři vlastní, nebo plánují nákup dálkového ovladače RC-03, přesto, program napíšeme, tak aby chodil i na tomto zařízení. Tři tlačítka ovladače jsou připojeny na piny C6, C7, C8, diodami jsou propojeny na C5, tak aby mohlo dojít uvolněním tlačítka k jeho probuzení v případě snižování spotřeby. S tím my se dnes nebudeme zabývat, zprovozníme si jednoduchý ovladač.


Obrázek 4: Zapojení ovladače RC-03

Vysílač

Jak už bylo uvedeno, vysílač je založen na dálkovém ovladači RC-03. Ten je možné si zakoupit hotový, nebo dle výše uvedeného schéma si sestavit, protože zapojení je velmi jednoduché. Základní myšlenkou uživatelské aplikace ovladače je pravidelné skenování tlačítek a zasílání jejich stavu ve zprávách. V níže uvededném programu je po stisku tlačítka spuštěn odpočet a po puštění posledního z ních jsou odvysílány ještě 2 zprávy. Tím je možné příjemci sdělit, že tlačítko už není stisknuto. Jednou z hlavních funkcí využívaných v aplikaci je funkce pro test stisknutého tlačítka

// otestuje tlacitka a vrati jejich stav
unsigned char OtestujTlacitka(void)
{
      unsigned char pomocna = 0;
      // otestuje tlacitka         
      waitMS(1);
      if (_SDO) pomocna|= 1;          
      if (_SDI) pomocna|= 2;         
      if (_SCK) pomocna|= 4;
      return pomocna;
}

Tak je volána v cyklu, a její návratová hodnota je jediným slovem odesílaným v RF zprávě. Kompletní zdrojový kód je uveden níže. Vzhledem ke své jednoduchosti není téměř třeba komentář. Přesto upozorňují, že kód na konci cyklu slouží k uspání modulu v případě, že tlačítko není stisknuto. To snižuje nároky na napájení.

#include "includes/template-basic.h"

#define MAX_TRANSMIT_TIME 3


void  NastavPeriferie(void);  
unsigned char OtestujTlacitka(void);

      
void APPLICATION()
{
      unsigned int doba_vypnuti = 0;
      unsigned char tlacitka = 0x00;
      NastavPeriferie();
      bufferRF[0] = 0x00;
      PIN = 0;    

      
      while (1)  
      {
         // smaže WATCHDOG
         clrwdt(); 
         
         // prečte tlačítka         
         tlacitka = OtestujTlacitka();         
         // přesune do bufferu stav tlačítek
         bufferRF[0] = tlacitka;
         // nastavi MAXIMALNI vykon
         setTXpower(7);         
         // nastavi nesitovy paket
         PIN = 0;
         // nastavi RF mod (delsi hlavicka)
         setRFmode(0x10); 
         // odesle paket
         RFTXpacket();         
         // blikne
         pulseLEDG();         
         // smaze WATCHDOG
         clrwdt();
         // pocka        
         waitMS(100);
         
         // pokud nebylo stisknuto tlacitko, pak se blizime ke spanku...
         tlacitka = OtestujTlacitka();
         if ((tlacitka & 7)  == 0) doba_vypnuti +=1; else doba_vypnuti = 0;         
         
         // pokud nebylo stisknuto skoro půl sekundy, pak se ulozime ke spanku
         if (doba_vypnuti > MAX_TRANSMIT_TIME)
         {
            while (doba_vypnuti)
            {
               // prejde do rezimu spánku, pokud je probuzen stiskem tlačítka,
               // vyskoci ze smycky, otestuje tlacitka...
               clrwdt();
               GIE = 0;
               RBIE = 1;
               iqrfSleep();
               RBIF = 0;
               if (OtestujTlacitka()) doba_vypnuti = 0;
               clrwdt();
            }
         }

      }   
}

// nastaveni periferii
void NastavPeriferie(void)
{ 
      // nastavi delku odesilanych dat
      DLEN=1;
      // zakaze SPI - tam mame tlacitka
      disableSPI();
      // nastavi porty jako vstupni
      TRISC |= 0x38;
      TRISA |= 0x28;
}

// otestuje tlacitka a vrati jejich stav
unsigned char OtestujTlacitka(void)
{
      unsigned char pomocna = 0;
      // otestuje tlacitka         
      waitMS(1);
      if (_SDO) pomocna|= 1;          
      if (_SDI) pomocna|= 2;         
      if (_SCK) pomocna|= 4;
      return pomocna;
}

Přijímač

Přijímač je již složitějším zařízením, alespoň co se týče logiky zpracování zpráv. Je totiž vhodné zabezpečit, že při zákmitech na vysílači nedojde k zákmitům na přijímači a také, že při držení tlačítek nedojde k neustálému přepínání relé na výstupu. Proto je vhodné testovat délku pauzy mezi stisky tlačítek a čítač této délku nulovat v situaci, kdy je tlačítko stisknuto. Tuto teorii osvětlím po uvedení zdrojového kódu:

#include "includes/template-basic.h"

#define OFF 0
#define ON  1

void APPLICATION()
{
  unsigned char Rstate = OFF;
  unsigned char Lstate = OFF;
  unsigned char Rcnt = 3;
  unsigned char Lcnt = 3;
  
  do
	{
		GIE=0;			// zakazani vsech preruseni
	}
	while (GIE);

  // nastavi WDT timeout na cca 130 ms
  WDTCON = 0b0000.1111;		
  OPTION |= 0b0000.1111;
     
  clrwdt();
  disableSPI();

	toutRF = 20;	
	// nastavi mod pro prijed zprav s delsi hlavickou (usporny rezim)
  setRFmode(0x01);
	
	Rstate = eeReadByte(0x01);
	Lstate = eeReadByte(0x02);
	_LEDR = Rstate;
	_LEDG = Lstate;

    while (1)
    {
		  clrwdt();

     
    	/* Cast s RF ovladanim */
      if	(RFRXpacket())	 // ceka na RF paket cca 200 ms		
  		{			 
        // prekopiruje obsah RF paketu do BufferInfo
        copyBufferRF2INFO();       
        
        // pocita pauzu po uvolneni tlacitka R
        if ( (bufferINFO[0] & 1) == 0)        
          if (Rcnt < 3)
            Rcnt +=1;
        
        // pocita pauzu po uvolneni tlacitka L
        if ( (bufferINFO[0] & 4) == 0)        
          if (Lcnt < 3)
            Lcnt +=1;            

        
        // pokud je stisktnuto tlacitko R, a byla predtim pauza
        // pak se zmeni stav rele R
        if (bufferINFO[0] & 1) 
          if(Rcnt > 2)
          {
            Rcnt = 0;
            Rstate ^=1;
            eeWriteByte(0x01,Rstate);
            _LEDR = Rstate;
          }
          
        // pokud je stisktnuto tlacitko L, a byla predtim pauza
        // pak se zmeni stav rele L
        if (bufferINFO[0] & 4) 
          if(Lcnt > 2)
          {
            Lcnt = 0;
            Lstate ^=1;
            eeWriteByte(0x02,Lstate);
            _LEDG = Lstate;
          }          
     
        // vymaze oba buffery
        clearBufferINFO();
  			copyBufferINFO2RF();   			
  			
  		}
      /* Konec casti s RF ovladanim */   

  	}
}

Jako příklad si vezmeme následující kód:

        // pocita pauzu po uvolneni tlacitka R
        if ( (bufferINFO[0] & 1) == 0)        
          if (Rcnt < 3)
            Rcnt +=1;
        
        // pocita pauzu po uvolneni tlacitka L
        if ( (bufferINFO[0] & 4) == 0)        
          if (Lcnt < 3)
            Lcnt +=1;            

Ten slouží k tomu, aby nastavoval čítače určující počet zpráv s "nestisknutím" levým nebo pravým tlačítkem. Jakmile je takových zpráv více než 3, pak se číslo nezvětšuje. Naproti tomu následující kód:

       // pokud je stisktnuto tlacitko R, a byla predtim pauza
        // pak se zmeni stav rele R
        if (bufferINFO[0] & 1) 
          if(Rcnt > 2)
          {
            Rcnt = 0;
            Rstate ^=1;
            eeWriteByte(0x01,Rstate);
            _LEDR = Rstate;
          } 

Testuje stisknuté tlačítko, ale také délku předchozí mezery mezi stisky. Přitom pokud jsou splněny obě podmínky, čítač samozřejmě vynuluje. Dále invertuje stav "Rstate", uloží jej do eeprom (pro případ výpadku napájení) a přenese jej na výstup. Obdobný kód je i pro stav druhého tlačítka.

Jak je vidět, vytvořit jednoduchý, ale přitom bezproblémový ovladač není s moduly IQRF nic složitého. V dalším díle bychom si rozšířili přijímač a dodali mu trochu více inteligence. Doplnili bychom ho o kalendář a automatiku.

Odkazy & Download

Hodnocení článku: 

Komentáře

Tak ono záleží na pohledu, mě to přišlo jednodušší takhle, méně výkonného kódu ve vysílačí, tím větší úspora energie. Ovšem máte-li nápad jak na to, určitě se podělte, můžeme to publikovat...