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

04.06.2013 16:19

Translate 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ět

Diskusní téma: Lekce 20 - Arduino a využití 433,92 MHz

Datum
Vložil
Titulek

Re: vysílač s PICAXE

Případně pro nějaký jiný levnější mc, např. ATtiny85

Datum
Vložil
Titulek

Re: Re: vysílač s PICAXE

Podobný projekt je zde: https://fluuux.de/2013/12/einfuhrung-in-umgang-mit-einem-433mhz-funkmodul/

Datum
Vložil
Titulek

Pomoc

Nevíte kde dělám chybu?
Hned u toho prvního příkladu když se snažím nahrát vysílač to píše toto:

Děkuji za radu

sketch_apr18a.ino: In function 'void setup()':
sketch_apr18a.ino:13:18: error: too few arguments to function 'void lwtx_setup(int, byte, byte, int)'
In file included from sketch_apr18a.ino:1:0:
C:\Program Files (x86)\Arduino\libraries\LwTx/LwTx.h:37:13: note: declared here
extern void lwtx_setup(int pin, byte repeats, byte invert, int uSec);
^
Chyba kompilace.

Datum
Vložil
Titulek

Re: Pomoc

lwtx_setup (int pin, byte repeats, byte invert, int uSec);

Je třeba tam mít 4 hodnoty.

Datum
Vložil
Titulek

komunikacia

Dalo by sa nastaviť aby medzi sebou komunikovali v oboch smeroch ak áno tak ako ?

Datum
Vložil
Titulek

Re: komunikacia

Tak pro obousmernou komunikaci potrebujes 2 pary prijmac-vysilac aby mela kazda strana prijmac i vysilac. Pak by bylo asi potreba osetrit aby jeden modul neprijmal kdyz vysila, bo by poslouchal sam sebe ;-)

Datum
Vložil
Titulek

Re: komunikacia

na jedné straně bude přijímač a vysílač a na druhé straně bude vysílač a přijímač. Ale už to asi víš. A ty tlačítka a odpory bych otočil. Odpor proti plusu a tlačítko na zem.

Datum
Vložil
Titulek

Library EEPROM

Ahojte, chcem sa spýtať že prečo treba pri kóde s vysielačom a prijímačom je treba importovať aj knižnicu EEPROM :)

Datum
Vložil
Titulek

opačně popisky

Jestli to někomu nejde, tak možná proto že má stejný problém jako já, už jsem 433,92 používal, ale nějak se mi vykouřilo co je přijímač a co vysílač, tak jsem se koukl na začátek tohoto tutoriálu, kódy jsem už měl svoje z minula a věděl jsem že jsou funkční, ale ouha, x hodin pokusů a nic. až teď jsem na to přišel - autor má opačně popisky PŘIJÍMAČ/VYSÍLAČ u fotek modulů !!!

prosím opravit...

jinak tutoriály jsou supr, pomohly mi v začátcích hodně a i teď se k nim uchyluji, když potřebuji něco ujasnit...

Datum
Vložil
Titulek

uprava kodu a funkcnost i na 868MHz

tak problém vyřešen.

V kódu pro vysílač upravit řádek:
lwtx_setup(7, 10, 0, 140); //7 číslo portu, 10 počet opakování vysílání,140us je rychlost vysílání tech deseti opakování

V kódu pro přijímač upravit řádek:
lwrx_getmessage(data, delka); // pouze odstranit *

Pochopitelně přidat knihovnu EEPROM.Odzkoušeno na 868MHz přijímač/vysílač a vše funkční :-)

<< 2 | 3 | 4 | 5 | 6 >>

Vyhledávání

arduino8.cz © 2015 Všechna práva vyhrazena.