Chcete do svého dalšího projektu s Arduinem přidat bezdrátové funkce za cenu nižší než cena šálku kávy? Pak jsou 433MHz RF vysílací a přijímací moduly právě pro vás! Na internetu je často seženete za méně než dva dolary za pár, což z nich dělá jednu z nejlevnějších možností datové komunikace, kterou můžete získat. A co je nejlepší, tyto moduly jsou velmi malé, což vám umožní začlenit bezdrátové rozhraní do téměř jakéhokoli projektu.
Přehled hardwaru
Podívejme se blíže na moduly 433MHz RF vysílače a přijímače.
Tento malý modul je vysílač mezi dvěma. Je opravdu jednoduchý, jak vypadá. Srdcem modulu je SAW rezonátor, který je naladěn pro provoz na frekvenci 433,xx MHz. Je zde spínací tranzistor a několik pasivních součástek, to je vše.
Když je na vstup DATA přivedena logická HIGH, oscilátor běží a produkuje konstantní výstupní RF nosnou vlnu na frekvenci 433,xx MHz, a když je vstup DATA přiveden na logickou LOW, oscilátor se zastaví. Tato technika je známá jako Amplitude Shift Keying (klíčování s amplitudovým posunem), kterou si za chvíli podrobně probereme.
Tento je přijímací modul. Ačkoli vypadá složitě, je stejně jednoduchý jako modul vysílače. Skládá se z VF laděného obvodu a dvojice OP zesilovačů pro zesílení přijaté nosné vlny z vysílače. Zesílený signál je dále přiváděn do PLL (Phase Lock Loop), která umožňuje dekodéru „uzamknout“ proud digitálních bitů, což poskytuje lepší dekódovaný výstup a odolnost proti šumu.
ASK – Amplitude Shift Keying
Jak bylo uvedeno výše, pro odesílání digitálních dat prostřednictvím rádia používají tyto moduly techniku zvanou Amplitude Shift Keying neboli ASK. Při Amplitude Shift Keying se amplituda (tj. úroveň) nosné vlny (v našem případě jde o 433MHz signál) mění v závislosti na příchozím datovém signálu.
Je to velmi podobné analogové technice amplitudové modulace, kterou možná znáte, pokud jste obeznámeni s AM rádiem. Někdy se jí říká binární klíčování s amplitudovým posunem, protože nás zajímají pouze dvě úrovně. Můžete si to představit jako přepínač ON/OFF.
- Pro digitální 1 – To řídí nosnou v plné síle.
- Pro digitální 0 – To nosnou úplně odřízne.
Takto vypadá amplitudová modulace:
Amplitudové klíčování s posunem má tu výhodu, že je velmi jednoduché na realizaci. Je poměrně jednoduché navrhnout obvody dekodéru. Také ASK potřebuje menší šířku pásma než jiné modulační techniky, například FSK (Frequency Shift Keying). To je jeden z důvodů, proč je levná.
Nevýhodou však je, že ASK je náchylná k rušení jinými rádiovými zařízeními a šumem pozadí. Pokud však udržujete přenos dat na relativně nízké rychlosti, může spolehlivě fungovat ve většině prostředí.
Vysílač RF 433MHz &Vývody přijímače
Podívejme se na vývody modulů vysílače a přijímače RF 433MHz.
Pin DATA přijímá digitální data určená k přenosu.
VCC napájí vysílač. Může to být libovolné kladné stejnosměrné napětí v rozsahu 3,5 V až 12 V. Všimněte si, že VF výstup je úměrný napájecímu napětí, tj. čím vyšší je napětí, tím větší bude dosah.
GND je zemnicí pin.
Antenna je pin pro externí anténu. Jak již bylo řečeno dříve, k tomuto pinu budete chtít připájet 17,3 cm dlouhý kousek pevného drátu pro lepší dosah.
VCC napájí přijímač. Na rozdíl od vysílače musí být napájecí napětí pro přijímač 5 V.
Piny DATA vyvedou přijatá digitální data. Oba prostřední piny jsou vnitřně svázány, takže pro výstup dat můžete použít kterýkoli z nich.
GND je zemnicí pin.
Antenna je pin pro externí anténu, který často není označen. Je to podložka v levém dolním rohu modulu, hned vedle malé cívky. Opět budete chtít k tomuto kolíku připájet 17,3 cm dlouhý kousek pevného drátu pro lepší dosah.
Zapojení – Připojení 433MHz RF vysílače a přijímače k Arduinu UNO
Teď, když už o modulech víme všechno, je čas je začít používat!
Jelikož budeme posílat data mezi dvěma deskami Arduino, budeme samozřejmě potřebovat dvě desky Arduino, dva breadboardy a pár propojovacích vodičů.
Zapojení vysílače je poměrně jednoduché. Má pouze tři připojení. Připojte pin VCC k pinu 5V a GND k zemi na desce Arduino. Vývod Data-In by měl být připojen k digitálnímu vývodu č. 12 Arduina. Měli byste se pokusit použít pin 12, protože ve výchozím nastavení knihovna, kterou budeme používat v našem náčrtu, používá tento pin pro vstup dat.
Následující obrázek ukazuje zapojení.
Jakmile máte vysílač zapojený, můžete přejít k přijímači. Zapojení přijímače je stejně snadné, jako bylo zapojení vysílače.
Opět je třeba provést pouze tři spoje. Připojte pin VCC k pinu 5V a GND k zemi na Arduinu. Kterýkoli ze dvou prostředních pinů Data-Out by měl být připojen k digitálnímu pinu #11 na Arduinu.
Takto by mělo vypadat zapojení přijímače.
Teď, když jsou vysílač i přijímač zapojeny, budeme muset napsat nějaký kód a poslat ho na příslušné desky Arduino. Protože máte pravděpodobně pouze jeden počítač, začneme vysílačem. Jakmile bude kód nahrán tam, přejdeme k přijímači. Arduino, ke kterému je připojen vysílač, pak můžeme napájet pomocí zdroje nebo baterie.
Knihovna RadioHead – švýcarský armádní nůž pro bezdrátové moduly
Než začneme kódovat, je tu knihovna RadioHead, kterou budeme muset nainstalovat do našeho prostředí Arduino IDE a která nám psaní kódu značně zjednoduší.
RadioHead je knihovna, která umožňuje jednoduchý přenos dat mezi deskami Arduino. Je natolik univerzální, že ji lze použít k řízení nejrůznějších rádiových komunikačních zařízení, včetně našich 433MHz modulů.
Knihovna RadioHead dělá to, že vezme naše data, zapouzdří je do datového paketu, který obsahuje CRC (Cyclic Redundancy Check), a pak je s potřebnou preambulí a hlavičkou pošle jinému Arduinu. Pokud jsou data přijata správně, přijímající Arduino je informováno, že jsou k dispozici data, a přistoupí k jejich dekódování a akci.
Paket RadioHead je tvořen následujícím způsobem: Na začátku každého přenosu je odeslán 36bitový proud párů bitů „1“ a „0“, který se nazývá „tréninková preambule“. Tyto bity jsou nezbytné k tomu, aby přijímač mohl nastavit svůj zisk před získáním skutečných dat. Následuje 12bitový „Start Symbol“ a poté jsou přidána vlastní data (payload).
Na konec paketu je přidána kontrolní sekvence rámce neboli CRC, kterou RadioHead na straně přijímače přepočítá, a pokud je kontrola CRC správná, je přijímací zařízení upozorněno. Pokud kontrola CRC selže, paket je zahozen.
Celý paket vypadá nějak takto:
Knihovnu si můžete stáhnout, když navštívíte airspayce.com nebo stačí kliknout na toto tlačítko a stáhnout zip:
Pro její instalaci otevřete Arduino IDE, přejděte na Sketch > Include Library > Add .ZIP Library a poté vyberte soubor RadioHead, který jste právě stáhli. Pokud potřebujete více informací o instalaci knihovny, navštivte tento návod Instalace knihovny Arduino.
Kód Arduina – pro 433MHz RF vysílač
V našem experimentu budeme pouze posílat jednoduchou textovou zprávu z vysílače do přijímače. Pomůže nám pochopit, jak používat moduly, a může posloužit jako základ pro další praktické experimenty a projekty.
Tady je sketch, který budeme používat pro náš vysílač:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init();} void loop(){ const char *msg = "Hello World"; rf_driver.send((uint8_t *)msg, strlen(msg)); rf_driver.waitPacketSent(); delay(1000);}
Je to docela krátký sketch, ale stačí k tomu, aby se signál vysílal.
Sketch začíná zařazením knihovny RadioHead ASK. Musíme také zahrnout knihovnu Arduino SPI, protože knihovna RadioHead je na ní závislá.
#include <RH_ASK.h>#include <SPI.h>
Dále musíme vytvořit objekt ASK, abychom měli přístup ke speciálním funkcím souvisejícím s knihovnou RadioHead ASK.
// Create Amplitude Shift Keying ObjectRH_ASK rf_driver;
Ve funkci setup musíme inicializovat objekt ASK.
// Initialize ASK Objectrf_driver.init();
Ve funkci loop začneme přípravou zprávy. Je to jednoduchý textový řetězec a je uložen ve znakovém ukazateli s názvem msg. Mějte na paměti, že, vaše zpráva může být jakákoli, ale neměla by přesáhnout 27 znaků pro lepší výkon. A nezapomeňte spočítat počet znaků v ní, protože tento počet budete potřebovat v kódu přijímače. V našem případě máme 11 znaků.
// Preparing a messageconst char *msg = "Hello World";
Zpráva se pak přenáší pomocí funkce send()
. Ta má dva parametry: první je pole dat a druhý je počet bajtů (délka dat), která se mají odeslat. Po funkci send()
obvykle následuje funkce waitPacketSent()
, která čeká, dokud není dokončen přenos některého předchozího vysílacího paketu. Poté sketch chvíli čeká, aby měl náš přijímač čas vše přijmout.
rf_driver.send((uint8_t *)msg, strlen(msg));rf_driver.waitPacketSent();delay(1000);
Kód Arduina – pro 433MHz RF přijímač
Přijímač Arduino připojte k počítači a načtěte následující kód:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init(); // Setup Serial Monitor Serial.begin(9600);} void loop(){ // Set buffer to size of expected message uint8_t buf; uint8_t buflen = sizeof(buf); // Check if received packet is correct size if (rf_driver.recv(buf, &buflen)) { // Message received with valid checksum Serial.print("Message Received: "); Serial.println((char*)buf); }}
Stejně jako kade vysílače začíná kód přijímače načtením knihoven RadioHead i SPI a vytvořením objektu ASK.
#include <RH_ASK.h>#include <SPI.h> RH_ASK rf_driver;
Ve funkci setup: inicializujeme objekt ASK a také nastavíme sériový monitor, protože tak budeme zobrazovat naši přijatou zprávu.
rf_driver.init();Serial.begin(9600);
Ve funkci loop: vytvoříme buffer o velikosti stejné jako vysílaná zpráva. V našem případě je to 11, pamatujete? Budete ji muset upravit tak, aby odpovídala délce vaší zprávy. Nezapomeňte zahrnout všechny mezery a interpunkční znaménka, protože všechny se počítají jako znaky.
uint8_t buf;uint8_t buflen = sizeof(buf);
Následuje volání funkce recv()
. Ta zapne přijímač, pokud ještě není zapnutý. Pokud je k dispozici platná zpráva, zkopíruje ji do svého prvního parametru bufferu a vrátí true, jinak vrátí false. Pokud funkce vrátí true, sketch vstoupí do příkazu if a vypíše přijatou zprávu na sériový monitor.
if (rf_driver.recv(buf, &buflen)){ Serial.print("Message Received: "); Serial.println((char*)buf); }
Poté se vrátíme na začátek smyčky a vše provedeme znovu.
Po načtení sketche otevřete sériový monitor. Pokud je vše v pořádku, měli byste vidět zprávu.
Zvýšení dosahu 433MHz RF modulů
Anterna, kterou použijete pro vysílač i přijímač, může skutečně ovlivnit dosah, který budete moci s těmito RF moduly získat. Ve skutečnosti byste bez antény byli rádi, kdybyste komunikovali na vzdálenost větší než jeden metr.
S vhodnou konstrukcí antény budete schopni komunikovat na vzdálenost 50 metrů. To je ovšem venku na volném prostranství. V interiéru bude váš dosah, zejména přes zdi, mírně oslaben.
Anterna nemusí být složitá. Jednoduchý kus jednožilového drátu může být vynikající anténou pro vysílač i přijímač. Průměr antény nemá téměř žádný význam, pokud je zachována její délka.
Nejúčinnější anténa má stejnou délku, jako je délka vlny, pro kterou se používá. Pro praktické účely postačí polovina nebo čtvrtina této délky.
Vlnová délka kmitočtu se vypočítá jako:
Délka vlny kmitočtu = | Rychlost přenosu (v) |
Frekvence přenosu (f) |
Vzduchem se rychlost přenosu rovná rychlosti světla, což je přesně 299 792 458 m/s. Vzduchem je rychlost přenosu rovna rychlosti světla. Pro pásmo 433 MHz je tedy vlnová délka:
Vlnová délka frekvence = | 299 792 458 m/s |
433 000 000 Hz | |
= | 0.6924 metrů |
= | 69,24 cm |
Jako plnovlnná anténa 69,24 cm je dost dlouhá anténa, její použití není příliš praktické. Proto se rozhodneme pro čtvrtvlnnou anténu, která vyjde přibližně na 17,3 cm nebo 6,8 palce.
Pro případ, že experimentujete s jinými rádiovými vysílači, které používají jiné frekvence, můžete použít stejný vzorec pro výpočet potřebné délky antény. Docela snadné, že?“
Ve vašem malém projektu Arduino se může zdát nepohodlná i anténa o délce 17,3 cm. NEBUĎTE však v pokušení anténu smotat, aby byla kompaktnější, protože to vážně ovlivní její dosah. Rovná anténa je vždy nejlepší!