Lekce 20 - Arduino a využití 433,92 MHz
04.06.2013 16:19Translate to English
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řijmač | 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 němel 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řejmně 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 komunkaci (el.l zásuvky ovládané dálkovým ovládáním) odesílá vysílač přimač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 antenku 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říjí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é, ketré 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 rozsítí a druhé jí zhasne. A dálkové ovládání třeba k zásuvkám máme hotové :-). Samozřejmně 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 čehoz získáme nějakou hodnotu) a něco kam budeme tyto hodnoty na přijmač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řipač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 16x2 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.
———
ZpětDiskusní téma: Lekce 20 - Arduino a využití 433,92 MHz
Datum | 20.05.2016 |
---|---|
Vložil | radekc |
Titulek | Re: uprava kodu a funkcnost i na 868MHz |
Vsichni, co tento zpackany navod ctou by ti meli libat ruce! Upravil jsem, jak pises, prohodil jsem moduly a uz to slape.
diky moc!
———
Datum | 14.01.2015 |
---|---|
Vložil | Jiří |
Titulek | frekvence |
Chtěl bych se zeptat. Budou tyhle knihovny fungovat i pro 868MHz vysílač/přijímač, nebo je potřeba stáhnout jiné? Děkuji
———
Datum | 10.01.2015 |
---|---|
Vložil | mema |
Titulek | otazka |
chci se zeptat hodí se i pro modely (lodí,letadel,aut,atd....)
———
Datum | 10.01.2015 |
---|---|
Vložil | mema |
Titulek |
chci se zeptat hodí se i pro modely (lodí,letadel,aut,atd....)
———
Datum | 23.07.2014 |
---|---|
Vložil | Lukas |
Titulek | pomoc |
Ahoj, když se snažím nahrát kod pro přijímač ta mi to napíše:
DHT_Bezdratove_prijimac.ino: In function 'void loop()':
DHT_Bezdratove_prijimac:28: error: invalid conversion from 'byte*' to 'byte'
DHT_Bezdratove_prijimac:28: error: initializing argument 2 of 'boolean lwrx_getmessage(byte*, byte)'
Poradí prosím někdo? Děkuji
———
Datum | 02.10.2014 |
---|---|
Vložil | Jakub |
Titulek | Re: pomoc |
Take by me zajimalo. proc mi to nejde.
———
Datum | 05.10.2014 |
---|---|
Vložil | Bin |
Titulek | Re: Re: pomoc |
Knihovny jsou spatne.Stahnout z jineho webu.Pak to pujde :)
———
Datum | 15.01.2015 |
---|---|
Vložil | Jiří |
Titulek | Re: Re: Re: pomoc |
Nikde po několikahodinovém hledání jsem nenašel knihovny, které by vyřešily tento problém.Zda máte někdo nějaké funkční, případě jak upravit kód aby to fungovalo, byl bych vděčný :-)
———
Datum | 16.01.2015 |
---|---|
Vložil | Lubos Zahradil |
Titulek | Re: Re: Re: Re: pomoc |
Ahoj,
se stavajici knihovnou z tohoto webu
staci zamenit v radku
lwrx_getmessage(data,&delka);
na
lwrx_getmessage(data,delka);
———
Datum | 17.07.2014 |
---|---|
Vložil | Brand |
Titulek | Přepínač |
dobrý den,
dalo by se použít přepínač místo spínače s odporem k zemi ?
jeden vývod bych připojil na Vcc a druhý na GND.
fungovalo by to ?