Lekce 20 – Arduino a využití 433,92 MHz

Po nějaké době opět zdravím u dnešního tutoriálu, který se bude na přání věnovat využití frekvence 433,92Mhz (434Mhz) na bezdrátové ovládání čehokoliv na vzdálenost řekněme při dobrých podmínkách do 50m. Pracovat s ním budeme samozřejmě s Arduinem. K tomuto budeme potřebovat dva moduly pro frekvenci 433,92 MHz a to jeden vysílací a jeden přijímací. Cenu modulů sem ani psát nebudu, je hodně druhů a já používám nějaký ze zahraničí za cenu asi okolo 100 až 150 Kč.

Přijímač Vysílač

Všechny moduly vypadají od různých firem vesměs stejně rozhodující bude funkce, která je u všech modulů stejná. Vyobrazený modul vysílače má celkem 3 vývody z čehož jsou 2 pro napájení a jeden pro data. U přijímače jsou celkem 4 piny, ale data jsou na pinech 2 a 3, jsou propojena, takže je jedno kam vodič “připíchnete”. Na modulech je zapojení čitelně značeno, takže by neměl vzniknout problém. Napájecí napětí je našich klasických 5V z Arduina.

Teď trošku k funkci. Představme si komunikaci mezi modulem (jednostranná od přijímače k vysílači) jako klasické vysílání rádia s tím, že probíhá digitálně (1000101010). Mnozí z Vás si ale myslí, že když přivedeme 1 (hodnota HIGH) na datový pin u vysílače tak se u přijímače objeví na datovém výstupu také jednička a když vysíláme 0 (hodnota LOW) tak na výstupu bude také 0. To není tak zcela pravda. V době dnešního digitálního vysílání to již na obrazovkách moc není vidět, ale v případě, kdy jste ztratili anténní příjem, tak jste na obrazovce viděli jen šum, v případě rádia také to jenom šumělo. A to je i v případě našeho přijímače. Neustále běhají na výstupu přijímače jedničky a nuly a to nekontrolovaně a zcela náhodně. Na vině je klasický šum z prostředí (vypínaní spotřebičů, atmosférické poruchy a jiné) a také ostatní vysílání na této frekvenci (meteostanice, dálková ovládání nebo jiná zařízení pracující z touto frekvencí 433 Mhz. Úkolem bude udělat v džungli jedniček a nul nějaká pravidla pro vysílač, který vyšle sekvenci dat v sekvenci, kterou si určíme a také abychom mohli naprogramovat Arduino s přijímačem tak, aby zrovna v záplavě jedniček a nul našel naše vysílání a zpracoval data jen taková, která chceme.

Samozřejmě to zase zní trošku složitě. My si vše ulehčíme. My totiž použijeme knihovnu využívající již vymyšlený a fungující protokol komunikace pro výrobky firmy RFLightWave. Ta totiž při komunikaci (el.l zásuvky ovládané dálkovým ovládáním) odesílá vysílač přijímači 10 4bitových hodnot (v překladu pošle 10 čísel v rozsahu od 0 do 15). Takže jako první si samozřejmě seženeme moduly vysílače a přijímače, dále budeme potřebovat 2 kusy nějakých Arduin (asi jedno jakých) a to je zatím vše.

Nejprve si postavíme vysílač. Modulek vysílače zapojíme např. přes kontaktní pole s Arduinem (v mém případě Arduino UNO). Napájení modulu klasicky a datový vstup jsem napojil na pin č. 3. jak můžete na obrázku níže vidět.

Vysílací modul bude obdobně zapojen s tím, že datový výstup s přijímače je na pin 2 s použitím Arduina MEGA.

Tak teď si stáhneme naše knihovny pro práci s vysílačem a přijímače. Knihovna je každá zvlášť pro přijímač a vysílač. Najdete ji na adrese zde. Po stažení si ze zipu nakopírujete z adresáře libraries dva adresáře LvRx a LvTx do adresáře libraries v prostředí Arduina. Kam kopírovat knihovny jsme si vysvětlili již v minulých dílech tak by Vám neměl vzniknout žádný problém. Kdyby na uvedeném odkazu již soubory nebyli, kontaktujte mě a já se pokusím nalézt jinde.

Tak po nahrání knihoven si do Arduina s vysílačem nahrajeme i tento program:

Jak vidíte není složitý. Máme tam funkci lwtx_setup(3, 2);, která inicializuje vysílač a nastaví, že datový vstup vysílače je na pinu 3. Druhý parametr ta dvojka je že se vysílač data odvysílá 2x za sebou, kdyby se v tom davu jedniček a nul asi nějaké vysílání ztratilo. To zvyšuje spolehlivost přenosu. Soudím dle autora knihovny. Potom tam máme funkci lwtx_free();, která vrací zda je vysílač volný a nemá žádnou práci. Vrací TRUE nebo FALSE. Když je tedy volný, můžeme vysílat. A nakonec funkce lwtx_send(data); – ta odešle konečně naše data. Jedná se o čísla od 0 do 9. (jak jsem již uvedl, můžete zadat čísla až do 15 (4bitové hodnoty). Výsledek se zobrazí na serial port s tím, že Arduino každých 5 sekund odvysílá naše data a na Serial port vypíše “Data odeslana”.

Tak jestli vysílač funguje správně zjistíme až si zprovozníme přijímač. Do druhého Arduina si připojíme modul přijímače. U mne tedy na pin 2. Pozor – knihovna pro příjem používá pro detekci přijmu signálu tzv. přerušení, takže můžeme použít v případě Arduina UNO nebo MEGA pouze pin 2 nebo 3. Přerušení – interrupt si vysvětlíme u zřejmě dalšího tutoriálu, kde jej využijeme. 

Nyní si nahrajeme do Arduina s přijímačem tento program:

Vysílač necháme zapnutý a přijímač zapojíme také. Spustíme si SerialMonitor (nezapomeňte si nastavit správný COM – port, aby jste nesledovali vysílač, kde se objevuje pouze nápis “Data odeslana”). Na výstupu vidíme, že se nám tam objevují po 5 vteřinách čísla  1 2 3 4 5 6 7 8 9 0 tak jak jsme je odvysílali 🙂

Tak pokud vidíte toto tak gratuluji, vše funguje bezvadně. Můžete si zkusit jaký má vysílač a přijímač dosah a připájet si jak u vysílače tak u přijímače anténku ve formě drátu nebo vodiče o délce 10 – 15 cm. V mém případě mám anténu pouze u vysílače a když jsem dal vysílač do druhé místnosti tak data na přijímač stále chodily. Ale samozřejmě že lepších výsledků dosáhnete, použijete-li anténu na obou zařízeních.

Data jsme si tedy nějak odeslali, ale nějak nevyužili. V prvním případě si ukážeme jak jednoduše zapínat a vypínat třeba nějaké spotřebič nebo zásuvku. Jak to tedy uděláme. Jednoduše. Prostě budeme odesílat jak jednu hodnotu pro zapnutí tak druhou pro vypnutí.

Na kontaktní pole si tedy dáme u vysílače ještě 2 tlačítka, která připojíme k digitálnímu pinu 4 (pro zapnutí) a 5 (pro vypnutí). Nesmíme zapomenout na odpor cca 10KOhm, který připojíme piny ke GND (LOW), jinak v případě nestisknutého tlačítka tam nebyla ani LOW ani HIGH hodnota. Ale pro jistotu malý plánek :-):

Tak taková tlačítka tedy připojíme 2. Nahrajeme do Arduina tento prográmek:

Z programu je zřejmé, že jsme si připravili do proměnných “zapnuto” a “vypnuto” hodnoty. Rozdílná je pouze hodnota na konci, kde při zapnutí je 1. Program v cyklech hlídá, zda bylo stisknuto nějaké tlačítko. Když zjistí, že ano odešle přijímač hodnotu buď k zapnutí nebo vypnutí. Teď, když si zapneme přijímač a k němu SerialMonitor, uvidíme hodnoty, které byly přijmuty při stisku tlačítek. To čekání (delay(400);) je tam z důvodu, že stisk může trvat nějakou dobu a hodnoty by se neustále odesílali.

Je to opravdu hodně zjednodušeno, ale funkci to splní, teď si jenom napíšeme jiný prográmek pro přijímač a k Arduinu s modulem přijímače připojíme LED diodu k pinu 3, která bude simulovat zapnutí třeba relé, které bude zapínat a vypínat zásuvku či jiný spotřebič (nezapomeňte na odpor tak cca 1,2 kOhm k LED).

A co se nám stalo? Jedno tlačítko diodu rozsvítí a druhé jí zhasne. A dálkové ovládání třeba k zásuvkám máme hotové :-). Samozřejmě můžeme přidat další tlačítka k ovládání čehokoliv jak jen je libo a co nám Arduino dovolí.

Já ještě na konci nastíním, jak využít také vysílač a přijímač k přenosu nějakých dat k druhému zařízení. A vyzkoušíme si třeba přenést hodnotu teploty z čidla DTH11, jehož funkci a použití jsme si popsali v lekci 6. Připravíme si tedy nějaké čidlo v mém případě již zmíněné DHT11 (samozřejmě můžete použít i cokoliv jiného z čehož získáme nějakou hodnotu) a něco kam budeme tyto hodnoty na přijímači zobrazovat. Abych se vyhnul složitosti připojení, použiji LCD displej s modulem na I2C.

Tak nejprve si nahrajeme program do vysílače upraveného pro získání hodnoty z DHT11.

Vysvětlení k DHT11 najdete v lekci 6 takže to rozebírat nebudeme. Víme ale, že teplota z čidla je v celých číslech a na její uchování a přenos nám bude stačit nějaké 8-bitové číslo (0-255). Vysílač nám vysílá sekvenci 10ti 4bitových čísel. Použijeme tedy dvě poslední 4-bitová čísla do kterých si pomocí bitového posunu hodnotu o teplotě rozdělíme. Jak je vidět z kódu, je to velice jednoduché. Pokud by jsme potřebovali odeslat větší hodnotu než 255, použijeme více 4bitových čísel (bitový posun jsme si vysvětlili již u zápisu a čtení z EPROM) Například takto:

Tak vysílač je funkční, můžeme zkusit i bez displeje s přijímačem a ukázkou programu, kdy se hodnoty vypisují na SerialMonitor. Pokud, ale máme nějaký displej, připojíme a zkusíme si hodnotu o teplotě zobrazit. Jak jsem již podoktnul, já použiji LCD displej 16×2 znaků připojený na I2C modul, aby jsem měl zapojení co nejjednodušší a takto mi budou stačit k propojení displeje s Arduinem jen 4 vodiče. Kód pro přijímač je zde:

Přenos jakékoliv hodnoty je jednoduchý a pomocí rozložení hodnoty na 4bitové informace a následné složení není složité. Nyní by jste měli být schopni vytvořit i sami sofistikovanější projekty, kde budete  cokoliv řídit nebo přenášet hodnoty dálkově pomocí modulů na 433 MHz.


Translate »