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
- Domovská stránka IQRF: http://iqrf.org/weben/index.php
- IQRF na HW Shopu: http://obchod.hw.cz/?cls=spresenttrees&strid=118
- Domácí automatizace I: http://hw.cz/teorieapraxe/konstrukce/art3375-domaci-automatizace-i.html
Komentáře
debouncing na vysilacej strane
Zdravim,
nebolo by vhodnejsie urobit debouncing (prip. odfiltrovanie drzania tlacitka) uz na vysielacej strane? Kod pre prijimac sa mi zda zbytocne komplikovany. Vdaka
Tak ono záleží na
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...
souhlasim s vami
souhlasim s vami